を使用してファイルの1行を編集する必要がありますsed
。今問題は、特定のパターンをテキストと数字の組み合わせで置き換えることです。この数字は、後続の行ごとに増加し続ける変数です。sed
コマンドがすべての行に対して同時に実行されると、見つかったパターンはテキストと固定数字(数字の初期値など)に置き換えられます。
たとえば、
k = 10
sed "s/raj/ram${k++}/"
答え1
ファイルが非常に小さい場合は、次のことができます。
#!/bin/bash
for n in {1..40}
do
sed -i $n's/raj/ram'$n'/' file
done
ファイルを40回繰り返し、常に1行だけ置き換えます。行番号ではなく変更された行数でカウンタを増やすには、2つの変数を使用して別の方法で実行する必要がありますが、sedコマンドは次のようになります。 n はループによって設定されません。
sed -iはファイルをその場所で変更するため、元のファイルを保持する前にコピーを作成する必要があります。
必要に応じてオネライナーで行うことができます。
for n in {1..40}; do sed -i $n's/raj/ram '$n'/' file ; done
自動的に40を選択するのではなく、正確なサイズを選択することも可能です。
答え2
awk -v n=10 '{sub(/raj/, "ram" n); print; n++}'
答え3
たまにはそれを使うべき時もありsed
、時には使わない時もあります。組み込みの算術演算がないので、他のものを使用してください
。 forループなしでsedをハックすることでこれを行うことができますが、より適切なものを使用することに比べて意味がなく、混乱したアセンブリにすぎません。 sed
次の入力データを使用してください。
printf '%s\n' 'a.raj' 'yyy' 'zzz' 'b.raj c.raj' >file
num=10 # start with this value
これは増加するPerlメソッドです。すべて発生raj
(各一致行が複数回発生)
perl -pe 'BEGIN{ $num='$((num-1))' }
s/raj/ram.($num+=1)/ge' file
出力:
a.ram10
yyy
zzz
b.ram11 c.ram12
これは別のものです。真珠バージョン、増分raj
バージョンのみ一致する行ごとに1回(つまり、同じ数のサフィックスを使用して同じ行に複数の一致があります)
perl -pe 'BEGIN{ $num='$num' }
if(/raj/){ s/raj/ram.$num/ge; $num+=1 }' file
出力:
a.ram10
yyy
zzz
b.ram11 c.ram11
望むより:いつsedを使用しないでください。