sed の最初の改行には追加のバックスラッシュが必要です。

sed の最初の改行には追加のバックスラッシュが必要です。

一致するパターンの後にいくつかのテキストを追加するときは、コンテンツの残りの部分と追加のコンテンツを分離するためにコメントを含む空白行を追加したいと思います。しかし、最初の項目では、追加を\n使用してエスケープする必要がありましたが、追加された残りのテキストには必ずしも必要ではないことがわかりました。\\\\nなぜですか?

SUSE 11サーバー(bash v3.2.57(2)およびGNU sedバージョン4.1.5)で作成した例は次のとおりです。

edwdev@hdpedge1:/edw> sed '/test/a \\nNot a test\nJust Playing' <<< test
test

Not a test
Just Playing

最初の項目をエスケープしない場合\nasedコマンドの後にN包装の代わりに印刷してください。

edwdev@hdpedge1:/edw> sed '/test/a \nNot a test\nJust Playing' <<< test
test
nNot a test
Just Playing

a誤って代替構文と競合しないように、コマンドの後に意図的にスペースを追加しました。

\nに変更すると、同じ動作が観察されます\t。コマンドの後のスペースの数はa重要ではないようです。複数のスペースがあっても特殊文字を印刷するには、最初のバックスラッシュをエスケープする必要があります。


これは最初に観察された他の環境でも同様でした。 Centos 7 x64 VM、bashバージョンは4.2.46(2)、sedバージョンはGNU sed 4.2.2でした。

sed -i '/\[mysqld\]/a \\n# <<INSERTED MANUALLY>>\ntransaction-isolation=READ-COMMITTED\ninnodb_flush_method=O_DIRECT\nmax_connections=550\n# <<END OF MANUAL INSERTIONS >>\n' /etc/my.cnf

出力:

...
[mysqld]

# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>

...

まず、出力をエスケープ解除します。\ n:

[mysqld]
n# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>

このような行動をする特別な理由はありますか?文書の閲覧中に詳細が見つかりません(ここ)、もちろん私は文書全体を徹底的に読んでいません。

ベストアンサー1

基準a命令の形sed

a\
text to be appended

cコマンドとi同じ形式に従います。

より多くの行を追加するには、各行で改行をエスケープする必要があります。

a\
text to\
be appended

標準はGNUのように改行文字を解釈する方法がsedわからないので、GNU以外のものを使用する1行のコマンドは(in)のように書かれます。\nsedsedbash

sed $'/test/a\\\n\\\nNot a test\\\nJust Playing\n' <<<test

ここでは$'...'、シェルを使用してすべてを\n実際の改行文字\\\

$'...'このコマンドは次の形式で作成できますが、次の機能はありませんbash

sed '/test/a\
\
Not a test\
Just Playing
' <<<test

これら2つのコマンドはGNUでも機能しますsed

GNUはsedさらに、前のテキストと改行文字の間に改行文字を挿入することなく追加のテキストが表示されるようにし、完全な削除をa許可します。\\ただし、コマンドの直後のコマンドは、コマンドaの標準形式でバックスラッシュとして解釈されます。a\(これはあなたの質問の基本的な問題です)。 GNUはsedまた、スクリプトに追加されたテキストの末尾に改行を追加します。したがって、GNUを使用すると、sed次のように書くことができます。

sed '/test/a\ \
Not a test\
Just Playing' <<<test

sedまたはGNUが知っているという事実を活用して\n

sed '/test/a\\nNot a test\nJust Playing' <<<test

おすすめ記事