289

なんらかの理由で、これに対する簡単な答えを見つけることができないようで、現在、少し時間に追われています。sedコマンドを使用して、特定の文字列に一致する最初の行の後にテキストの選択行を挿入するにはどうすればよいですか。私は持っている ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

そして、行の後に行を挿入したいCLIENTSCRIPT=...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
4

8 に答える 8

426

GNU sed を使用してこれを実行してみてください。

sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

in-placeに置き換えたい場合は、使用します

sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

出力

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

ドク

  • sed docを参照して検索\a(追加)
于 2013-03-21T22:27:07.867 に答える
20

s次のコマンドを使用した POSIX 準拠のもの:

sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file
于 2016-12-20T20:51:40.887 に答える
1

同様のタスクがあり、上記の perl ソリューションを機能させることができませんでした。

これが私の解決策です:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

説明:

正規表現を使用して、/etc/mysql/my.cnf ファイル内の行を検索し、[mysqld]それを

[mysqld] collation-server = utf8_unicode_ci

collation-server = utf8_unicode_ciを含む行の後に行を効果的に追加し[mysqld]ます。

于 2015-07-07T20:15:03.447 に答える
0

私は最近、MacとLinux OSの両方でこれを行う必要があり、多くの投稿を閲覧して多くのことを試した後、私の特定の意見では、私が望んでいた場所にたどり着くことはありませんでした:よく知られているソリューションを使用して理解するのに十分シンプルシンプルなパターン、ワンライナー、ポータブル、拡張可能な制約を追加する標準コマンド。それから、別の視点でそれを見ようとしました。そのとき、「2 ライナー」が残りの基準を満たしていれば、「1 ライナー」オプションがなくてもよいことに気付きました。最後に、UbuntuとMacの両方で機能するこのソリューションを思いつきました。これをみんなと共有したかったのです。

insertLine=$(( $(grep -n "foo" sample.txt | cut -f1 -d: | head -1) + 1 ))
sed -i -e "$insertLine"' i\'$'\n''bar'$'\n' sample.txt

最初のコマンドで、grep は「foo」を含む行番号を探し、cut/head は最初の出現を選択し、出現の後に挿入したいので、算術演算はその最初の出現行番号を 1 増やします。2 番目のコマンドでは、インプレース ファイル編集、挿入用の "i" です。新しい行を引用する ansi-c、"bar"、そして別の新しい行です。その結果、「foo」行の後に「bar」を含む新しい行が追加されます。これら 2 つのコマンドはそれぞれ、より複雑な操作とマッチングに拡張できます。

于 2020-05-11T06:05:42.543 に答える