Sed regexp 多行 - 替换 HTML

Chr*_*son 4 regex linux tags sed

我正在尝试在 Linux 系统上使用 sed 替换多行

这是我的文件

<!-- PAGE TAG -->
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
<div id="DATA"></div>
DATA8
DATA9
<!-- PAGE TAG -->
Run Code Online (Sandbox Code Playgroud)

我所做的尝试和失败!

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'
Run Code Online (Sandbox Code Playgroud)

中间的所有东西都<!-- PAGE TAG -->应该更换。

这个问题类似于 sed multiline replacement

Tim*_*ote 5

虽然 @nhahtdh 的答案是您最初问题的正确答案,但此解决方案是对您的评论的答案:

sed '
  /<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ {
    1 {
      s/^.*$/Replace Data/
      b
    }
    d
  }
'
Run Code Online (Sandbox Code Playgroud)

你可以这样读:

/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/-> 对于这些正则表达式之间的行

1 {-> 对于第一个匹配行

s/^.*$/Replace Data/-> 搜索任何内容并替换为Replace Data

b-> 分支到结束(在本例中行为类似于中断)

d-> 否则,删除该行

您可以通过在每个命令后添加分号来使用 gnu sed 将任何一系列 sed 命令变成单行命令(但如果您希望稍后能够阅读它,则不建议这样做):

sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 1 { s/^.*$/Replace Data/; b; }; d; };'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您应该在发布的内容中尽可能具体。“替换/删除”是指“替换或删除”。如果你想更换,直接说更换即可。这有助于我们尝试回答您的问题,也有助于未来可能遇到相同问题的用户。