【问题标题】:Remove two lines using sed使用 sed 删除两行
【发布时间】:2021-05-21 06:18:53
【问题描述】:

我正在编写一个可以解析 HTML 文档的脚本。我想删除两行,sed 如何使用换行符?我试过了

sed 's/<!DOCTYPE.*\n<h1.*/<newstring>/g'

这没有用。我试过这个语句,但它删除了整个文档,因为它似乎删除了所有换行符:

sed ':a;N;$!ba;s/<!DOCTYPE.*\n<h1.*\n<b.*/<newstring>/g'

有什么想法吗?也许我应该使用 awk?

【问题讨论】:

  • 第二个删除尽可能多的文本,包括换行符,因为 .* 是“贪婪的”(POSIX 正则表达式不支持惰性/非贪婪量词)并且 . 匹配任何字符,包括换行符一个 POSIX 正则表达式。
  • 用 sed -z 试试
  • I'm writing a script which can parse an HTML document --> 不推荐使用sed。使用 xmlstarlet 之类的工具或具有解析 xml/html 的库的编程语言。如果您必须使用sed/awk/perl 并且必须在整行中匹配这些模式,请参阅stackoverflow.com/questions/38972736/…
  • Sundeep,抱歉,我不能使用 xmlstarlet 来完成这项任务。我需要删除以某些字符串开头的 2-3 行。它在 EMACS 中运行良好,但我想在脚本中进行。
  • I would like to remove two lines 哪两行? I need to remove 2-3 lines starting with certain strings 所以 2 或 3 行?究竟从哪个字符串开始?

标签: parsing awk sed newline


【解决方案1】:

对于删除两行(如果每行都匹配某个模式)的简单任务,您需要做的就是:

sed '/<!DOCTYPE.*/{N;/\n<h1.*/d}'

这使用与您要删除的第一行匹配的 地址。当地址匹配时,它执行:

  • Next - 将下一行附加到当前模式空间(包括\n

然后,它匹配第二行内容的地址(在\n 之后)。如果可行,它会执行:

  • delete - 丢弃当前输入并开始读取下一个未读行

如果d 没有被执行,那么这两行都将默认打印并且继续正常执行。

要调整这三行,你只需要再次使用N。如果您想拉入多行直到达到某个分隔符,您可以使用 line-pump,它看起来像这样:

/<!DOCTYPE.*/{
    :pump
    N
    /some-regex-to-stop-pump/!b pump
    /regex-which-indicates-we-should-delete/d
}

但是,在 sedawk 中编写完整的 XML 解析器是一项艰巨的任务,您最好使用现有的解决方案。

【讨论】:

  • 您可以编写这样的特定命令来删除任意数量的行。你只需要反复使用N。当我意识到您想在后续行中匹配时,我会调整我的答案...
【解决方案2】:

如果xml解析工具绝对不是一个选项,awk也许是一个选项:

awk '/<!DOCTYPE/ { lne=NR+1;next } NR==lne && /<h1/ { next }1' file

当我们遇到带有“的行时,将变量 lne 设置为行号 + 1 (NR+1),然后跳到下一行。然后当该行等于 lne (NR==lne) 并且该行包含“

【讨论】:

    【解决方案3】:

    我对这样的文档的解决方案:

    <b>...
    <first...
    <second...
    <third...
    <a ...
    

    这个 awk 命令运行良好:

    awk -v RS='<first[^\n]*\n<second[^\n]*\n<third[^\n]*\n' '{printf "%s", $0}'     
    

    就是这样。

    【讨论】:

      【解决方案4】:

      这可能对你有用(GNU sed):

      sed 'N;/<!DOCTYPE.*\n<h1.*/d;P;D' file
      

      添加以下行,如果模式匹配模式空间中的两行,则删除它们。

      否则,打印然后删除两行中的第一行并重复。

      要将这两行替换为另一个字符串,请使用:

      sed 'N;s/<!DOCTYPE.*\n<h1.*/another string/;P;D'
      

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 2013-05-01
        • 2013-04-08
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 2017-10-13
        • 1970-01-01
        相关资源
        最近更新 更多