繁体   English   中英

使用 sed 删除两行

[英]Remove two lines using sed

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

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

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

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

有任何想法吗? 也许我应该使用 awk?

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

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

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

  • N ext - append 当前模式空间的下一行(包括\n

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

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

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

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

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

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

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

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

当我们遇到带有“<.DOCTYPE”的行时,将变量 lne 设置为行号 + 1 (NR+1) 然后跳到下一行,然后当该行等于 lne (NR==lne) 并且行包含“<h1”。 跳到下一行。 使用 1 打印所有其他行。

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

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

这个 awk 命令运行良好:

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

就这样。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM