使用 sed 替换连续的 2 行

skr*_*mit 1 sed

我一直在尝试用以下sed命令替换连续的行:

sed -i -e '/string1/{N;s/string2/string2_replaced/;N;s/string3/string3_replaced}' file1

sed -i -e '/string1/{n;s/string2/string2_replaced/;n;s/string3/string3_replaced}' file1
Run Code Online (Sandbox Code Playgroud)

其中 file1 包含:

string1
string2
string3
Run Code Online (Sandbox Code Playgroud)

我不断得到sed: unmatched '/'。如何将 file1 的内容更改为:

string1
string2_replaced
string3_replaced
Run Code Online (Sandbox Code Playgroud)

所以只有当 string2 和 string3 在连续的行上并且它们紧跟在与 string1 匹配的行之后才被替换?

另外,如果我不确定它发生在哪里(哪一行),但确定它出现在 string1 之后,我该如何搜索和替换 string2?

cuo*_*glm 5

你错过了最后一个/,它是s/string3/string3_replaced/

sed -e '/string1/{N;s/string2/string2_replaced/;N;s/string3/string3_replaced/}' file1
Run Code Online (Sandbox Code Playgroud)

请注意,并非所有sed实现都支持{和内同一行中的多个命令}。便携性:

sed -e '/string1/ {
  N
  s/string2/string2_replaced/
  N
  s/string3/string3_replaced/
}' file1
Run Code Online (Sandbox Code Playgroud)