sedを使用して変数を含むファイルの行を編集する

sedを使用して変数を含むファイルの行を編集する

を使用してファイルの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を使用しないでください。

関連情報