我正在尝试使用 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