BSDのcshでsedを使用して1行を2行に置き換える方法は?

BSDのcshでsedを使用して1行を2行に置き換える方法は?

ここには、次の内容を含む非常に単純なテキストファイルがあります。

line1
line2
line3
line4

sed(または他のアプリケーション)を介してコンテンツを変更したいです。

line1
line2
#this line was added by sed
line3
line4

だから試してみましたが、sed -e "s/line2/line2\\n#this line was added by sed/" my-text-file-here.txt結果は次のとおりです。

line1
line2\n#this line was added by sed
line3
line4

正しく行う方法についてのアイデアはありますか?ありがとう

答え1

GNU sedを使用すると、コードは正しく機能します。

$ sed -e 's/line2/line2\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

ただし、BSD sed では、\n代替テキストでは改行文字は考慮されません。シェルがbashの場合、良い回避策は$'...'改行を挿入することです。

$ sed -e $'s/line2/line2\\\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

bashに加えて、zshとkshもサポートされています$'...'

別のオプションは、実際の改行文字を挿入することです。

$ sed -e 's/line2/line2\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

アップデート:cshの最後のオプションには追加が必要です\

% sed -e 's/line2/line2\\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

答え2

欲しいと思う実際には保留コマンドです。 Bashまたはサポートされているシェルの使用$'\n'(ほとんど):

sed $'/line2/a\\\n#this line was added by sed\n' file.txt

または、より読みやすく、sedコマンドファイルを使用してください。

/line2/a\
#this line was added by sed

完全な方法を表示:

$ cat file.txt 
line1
line2
line3
line4
$ cat sedfile 
/line2/a\
#this line was added by sed
$ sed -f sedfile file.txt 
line1
line2
#this line was added by sed
line3
line4
$ 

答え3

これは仮想cshシェルです:

1行ずつ追加するだけです。

% sed '/line2/a\\
# new line here\
' file
line1
line2
# new line here
line3
line4

別の行の前に行を挿入するには、次の手順を実行します。

% sed '/line3/i\\
# new line here\
' file
line1
line2
# new line here
line3
line4

1行を2つの新しい行に置き換えるには、次のコマンドを使用しますs

% sed 's/line2/&\\
# new line here/' file
line1
line2
# new line here
line3
line4

OpenBSD 6.1で動作し、sed基本cshシステムでテストされています。

関連情報