在 sed 替换中包括断行

Including break line in sed replacement

我有以下 sed 替换,如果在行中找到某个字符串,它会用不同的文本替换整行。

sed "s/.*FOUNDSTRING.*/replacement \"text\" for line"/ test.txt

这工作正常 - 但是,例如我想在 'for' 之后添加一个新行。我最初的想法是试试这个:

sed "s/.*FOUNDSTRING.*/replacement \"text\" for \n line"/ test.txt

但这最终会替换为以下内容:

replacement "text" for n line

期望的结果:

replacement "text" for 
line

在 sed 中使用换行符可能会很痛苦。根据您使用的版本,行为也存在一些差异。为了简单性和可移植性,我建议使用 awk:

awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : [=10=]}' file

如果模式匹配,则打印替换字符串,包括换行符,否则打印行 [=13=].

正在测试:

$ cat file
blah
blah FOUNDSTRING blah
blah
$ awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : [=11=]}' file
blah
replacement "text" for
line
blah

当然给猫剥皮的方法不止一种,如评论所示:

awk '/FOUNDSTRING/ { [=12=] = "replacement \"text\" for \n line" } 1' file

这会在模式匹配时用新字符串替换行 [=13=] 并使用常见的 shorthand 1 来打印每一行。