我正尝试在Linux系统上使用sed替换多行代码
这是我的档案
<!-- PAGE TAG -->
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
<div id="DATA"></div>
DATA8
DATA9
<!-- PAGE TAG -->我所做的尝试都失败了!
sed -n '1h;1!H;${;g;s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->//g;p;}'
sed -n '1!N; s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->// p'
sed -i 's|<!--[^>]*-->[^+]+<!--[^>]*-->||g'
sed -i 's|/\/\/<!-- PAGE TA -->/,/\/\/<!-- PAGE TA -->||g'<!-- PAGE TAG -->之间的所有内容都应该被替换。
这个问题类似于sed multiline replace
发布于 2012-06-15 09:33:16
虽然@nhahtdh的答案对你的原始问题是正确的,但这个解决方案是对你的评论的答案:
sed '
/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ {
1 {
s/^.*$/Replace Data/
b
}
d
}
'你可以这样读它:
这些正则表达式之间的行的/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ ->
第一个匹配行的1 { ->
s/^.*$/Replace Data/ ->搜索所有内容并替换为Replace Data
b ->分支到末尾(在这种情况下行为类似于break )
d ->否则,请删除该行
通过在每个命令后面添加分号,您可以使用gnu sed将任何一系列sed命令转换为一行程序(但如果您希望以后能够阅读它,则不建议这样做):
sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 1 { s/^.*$/Replace Data/; b; }; d; };'顺便说一句,你真的应该在你的帖子中尽可能地具体。"replaced/removed“表示"replaced或removed”。如果你想替换它,只需说替换即可。这对我们那些试图回答你的问题的人和可能遇到同样问题的未来用户都有帮助。
发布于 2012-06-15 09:06:02
根据你看到的链接中给出的答案,这应该是可行的:
sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/d'正则表达式的格式是[2addr]d,其中两个地址是用逗号分隔的/<!-- PAGE TAG -->/和/<!-- PAGE TAG -->/。d表示删除从与第一个地址匹配的行到与最后一个地址匹配的行开始的所有行。(它表示标签之外的内容,但与标签在同一行上的内容也将被删除)。
尽管Tim Pote已经回答了这个问题,但我还是在这里发布这篇文章,以防有人需要替换多行模式:
sed -n '1h; 1!H; ${g; s/<!-- PAGE TAG -->[^!]*<!-- PAGE TAG -->//g; p;}'我修改了现有源代码中的解决方案,因此命令的大部分内容都解释为here。
这里的正则表达式有点不完整,因为它假设两个页面标记之间的数据中没有!字符。如果没有这个假设,我就无法控制正则表达式匹配的字符数,因为没有惰性量词(据我所知)。
此解决方案不会删除标记之前的文本,即使它与标记在同一行上也是如此。
https://stackoverflow.com/questions/11043363
复制相似问题