[英]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
}
但是,在sed
或awk
中编写完整的 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.