なぜか簡単な答えが見つからず、今は時間に追われています。 sed`コマンドを使って、特定の文字列にマッチする最初の行の後に、選択行を挿入するにはどうしたらよいでしょうか。 私には ...
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
そして、CLIENTSCRIPT=
の行の後に行を挿入したいのですが、その結果は ...
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
GNU sedを使ってやってみてください。
sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
を代用したい場合は、次のようにします。
sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
\a
を検索してください(追記)。標準的なsed
の構文に注意してください(POSIXのように、GNU、OS/X、BSD、Solarisなど、すべての適合するsed
の実装でサポートされています)。
sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file
または1行で。
sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file
(-e
式(および -f
ファイルの内容)を改行でつなぎ、sed
が解釈する sed スクリプトを構成します)。
インプレース編集のための-i
オプションもGNUの拡張機能で、他の実装(FreeBSD'のような)では-i '
をサポートしているものもあります。
また、移植性を考慮して、代わりに perl
を使用することもできます。
perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file
または、ed
や ex
を使うこともできます。
printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
私も同じような作業をしていましたが、上記のperlでの解決方法ではうまくいきませんでした。
これが私の解決策です。
perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf
説明:。
正規表現を使って、 /etc/mysql/my.cnf ファイルの中で [mysqld]
だけが書かれている行を検索し、以下のように置き換えます。
[mysqld]' collation-server = utf8_unicode_ci
に置き換えました。
これにより、[mysqld]
を含む行の後に collation-server = utf8_unicode_ci
の行が追加されました。