特定の行で文字列を置き換える方法を知っています。たとえば、次のようになります。
sed -i "<line number>s/<old string>/<new string>/g" <file name>
しかし、複数行の文字列を置き換える方法がわかりません(たとえば、行番号1、10、100)。
答え1
私が知る限り、sedアドレスには1行しか含めることができません。範囲ライン。
sed -f -
ただし、シェルと一緒に標準入力から読み取るコマンドを使用して、何かを1つにまとめることができます。たとえば、
printf '%ds/<old string>/<new string>/g\n' {1,10,100} | sed -f - file
答え2
これはawkの答えです。
awk 'NR == 1 || NR == 10 || NR == 100 {gsub(/old/,"new")}; {print}' <file name>
説明する
NR == 1 || NR == 10 || NR == 100
:これらの行の1つだけで、次のコマンドを実行します。gsub(/old/,"new")
:/old/
に置き換えられましたnew
。{print}
:どの行に関係なく、その行を印刷します。
答え3
sedを直接使用する代替案:
sed '1b1; 10b1; 100b1; b ;:1;s/<old string>/<new string>/g' <file name>
行番号が1、10、または100と一致する場合、他の行はラベル1に分岐し、単に最後に分岐します(デフォルトでは行が印刷されます)。
やや自動化:
sed -e $(printf '%sb1;' 1 10 100) -e 'b; :1;s/<old>/<new>/g' <file name>
POSIXly(デフォルトIFSを使用):
sed $(printf -- '-e %sb1 ' 1 10 100) -e 'b' -e':1' -e 's/<old>/<new>/g'
答え4
まあ、どうですか?
sed -e '
/something_identifying_startline/,/something_identifying_endline/{
s/dog/cat/
s/black/white/
}