![sed 在包含多个无序字符串的行之后追加](https://linux22.com/image/97785/sed%20%E5%9C%A8%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA%E6%97%A0%E5%BA%8F%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E8%A1%8C%E4%B9%8B%E5%90%8E%E8%BF%BD%E5%8A%A0.png)
我正在尝试使用 sed 在包含和appendstring
的行之后追加。Hello
World
Hello something here World
World fsf Hello
如果我确实考虑顺序,这会起作用:
sed -i '/Hello*World\|World*Hello/a appendstring' file
但是如果我有很多字符串要匹配并且它们不按顺序排列,那么这肯定是无效的。
然后我尝试了另一个链接中的解决方案,该链接讨论删除包含两个字符串的行而不考虑它们的顺序。
https://stackoverflow.com/questions/28561519/delete-lines-that-contain-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