sed 在包含多个无序字符串的行之后追加

sed 在包含多个无序字符串的行之后追加

我正在尝试使用 sed 在包含和appendstring的行之后追加。HelloWorld

Hello something here World
World fsf Hello

如果我确实考虑顺序,这会起作用:

sed -i '/Hello*World\|World*Hello/a appendstring' file

但是如果我有很多字符串要匹配并且它们不按顺序排列,那么这肯定是无效的。

然后我尝试了另一个链接中的解决方案,该链接讨论删除包含两个字符串的行而不考虑它们的顺序。

https://stackoverflow.com/questions/28561519/delete-lines-that-c​​ontain-two-strings

然而,

sed -i '/Hello/!b;/World/d' file

这甚至不适用于删除。

以下内容,也是该问题的答案之一:

sed -i '/Hello/{/World/d}' file

作品,所以我尝试将其实现为追加。使用:

sed -i '/Hello/{/World/a} appendstring' file

但收到错误:

sed: -e expression #1, char 0: unmatched `{'

更新: 链接中的帖子用 !b 说明了解决方案,由于感叹号,它在 cshell 中不起作用,但它在 sh 和 bash 中起作用。而且它还可以轻松扩展为在脚本内运行 sed 时插入多行以及附加大段落。

sed -i '/Hello/!b; /World/a \
addline \
addanotherline ' file

答案1

你几乎已经受够了:

sed -i '/Hello/{/World/a} appendstring' file

你需要分开你的论点。使用-e,像这样:

sed -i -e '/Hello/{/World/a appendstring' -e '}' file

请注意,使用A没有换行符的 ppend 命令是 GNU 扩展,-i开关也是如此。


为了更方便地做到这一点,并考虑多个字符串匹配的可能性,请尝试:

sed '/multiple/{/words/{/to/{/match/ s/$/append this/;};};}' file > newfile
mv newfile file

由于您已经在使用 GNU Sed,因此只需使用:

sed -i -e '/multiple/{/words/{/to/{/match/ a append this' -e 'a and also this' -e 'a oh and this too' -e '};};}' file

相关内容