文字列を探して最初の文字列を見つけたら、別の文字列を置き換えます。

文字列を探して最初の文字列を見つけたら、別の文字列を置き換えます。

文書:

1
2
3
4
1
5
6
7
4

1文字列(この場合)を検索した後、次の文字列4をに変更したいと思います8
予想出力:

1
2
3
8
1
5
6
7
4

私は試した:

cat file | sed '/1/ s/4/8/'

しかし、これはその行で変更される文字列を探します。
また、最初の文字列と2番目の文字列の間に行数が異なる可能性があるため、元のファイルを行番号に置き換えることはできません。
GNU sedがインストールされていません。

ベストアンサー1

これPOSIX固有のファイルエディタ、ex、まさにそうすることができます。

printf '%s\n' '/1//4/s//8/' x | ex file.txt

ex複数のアドレスを結合する機能。したがって、/1/これは「正規表現に一致する次の行に移動する」(または引用)することを意味します1。それ/4/からその行で次の行と一致します4s//8/Sedのように一般的な意味を持ち、コマンドsに渡された空の正規表現は「最後に使用した正規表現の再使用」を意味します4

変更を保存せずに変更されたファイルを印刷するには、代わりに次のコマンドを使用します。

printf '%s\n' '/1//4/s//8/' %p | ex file.txt

複数のアドレスをよりよく理解するために、次のコマンドは、次を含む最初の行を削除します。cherry 今後最初の行には以下が含まれます。banana 後ろに27行目:

printf '%s\n' '27/banana/?cherry?d' x | ex file.txt

x変更を保存して終了するという意味は、%p「フルファイルの印刷」を意味します。 (最初の行から最後の行までのアドレス範囲である%yesの同義語です。)1,$

おすすめ記事