在 sed 替换中包括断行

use*_*194 1 regex bash newline sed

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

sed "s/.*FOUNDSTRING.*/replacement \"text\" for line"/ test.txt
Run Code Online (Sandbox Code Playgroud)

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

sed "s/.*FOUNDSTRING.*/replacement \"text\" for \n line"/ test.txt
Run Code Online (Sandbox Code Playgroud)

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

replacement "text" for n line
Run Code Online (Sandbox Code Playgroud)

期望的结果:

replacement "text" for 
line
Run Code Online (Sandbox Code Playgroud)

Tom*_*ech 5

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

awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : $0}' file
Run Code Online (Sandbox Code Playgroud)

如果模式匹配,这将打印替换字符串,包括换行符,否则打印 line $0

测试一下:

$ cat file
blah
blah FOUNDSTRING blah
blah
$ awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : $0}' file
blah
replacement "text" for
line
blah
Run Code Online (Sandbox Code Playgroud)

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

awk '/FOUNDSTRING/ { $0 = "replacement \"text\" for \n line" } 1' file
Run Code Online (Sandbox Code Playgroud)

$0当模式匹配时,这会用新字符串替换该行,并使用通用速记1来打印每一行。