特定の行の文字列をsedに置き換える

特定の行の文字列をsedに置き換える

特定の行で文字列を置き換える方法を知っています。たとえば、次のようになります。

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/
        }

関連情報