GNU Sedでは、最初のものを1)に、2番目のものを2)に置き換えます。

GNU Sedでは、最初のものを1)に、2番目のものを2)に置き換えます。

擬似コードは次の連続です。この回答

gsed 's/|/1)/g' 's/|/2)/2g' 's/|/3)/3g' 's/|/5)/4g' 's/|/5)/5g' 
<input.csv >output.csv

もちろんこれはうまくいきません。私が興味を持っているのは、gsedそのようなサイクルをどのように管理するかです。

gsedそのようなループに拡張する方法は何ですか?

ベストアンサー1

上記の場合は、次のようにできます。

gsed 's/|/1)/; s/|/2)/; s/|/3)/; s/|/4)/; s/|/5)/'

例:

$ echo '| | | | |' | sed 's/|/1)/; s/|/2)/; s/|/3)/; s/|/4)/; s/|/5)/'
1) 2) 3) 4) 5)

|この方法は、行の最大数を事前に推定してs/|/N)/それに応じて追加できる場合に有効です。

1行の最大数を予測できない場合でも、を使用して計算でき、|バッファgsedを保持するカウンタを使用して次を使用できます。この賢いデバイス著者:ブルーノハイブル。しかし、実際の実装は少し難しいので、そのままにします。マゾヒスト敏感な読者。

もちろん、最も簡単な方法は以下を使用することですawk

awk '{ cnt = 0; while(sub(/\|/, ++cnt ")")); print }'

証明する:

$ echo '| | | | |' | awk '{ cnt = 0; while(sub(/\|/, ++cnt ")")); print }'
1) 2) 3) 4) 5)

おすすめ記事