如何使用 sed 打印网站标题
2021-11-15
198
我目前正在编写一个 sed 脚本,其中我必须按照某种打印方式打印网站的 30 个标题。 我遇到以下错误“sed:文件 news.sed 第 1 行:未知的“s”选项。这是我的代码:
curl -sL news.ycombinator.com |
sed -nE '/\n/!s/class="title"><a[^>]*>[^<]*</\n&\n/g;/^class="title"/P;D' |
sed -E 's/class="title"><a href="([^"]*)" class="titlelink">([^<]*)</**\2**\n\1/'
您知道我该如何修复它吗?顺便说一句,我只能使用 sed 来解决这个问题,而不能使用 html 解析器。
2个回答
这可能对您有用(GNU sed):
cat <<\! > news.sed
/\n/!s/class="title"><a[^>]*>[^<]*</\n&\n/g
/^class="title"/{
h
x
s/^class="title"><a href="([^"]*)" class="titlelink"[^>]*>([^<]*)<.*/**\2**\n\1/p
x
}
D
!
curl -sL news.ycombinator.com | sed -Enf news.sed
这将 2 个 sed 调用合并为一个 sed 脚本,并使用
-f
选项应用它。
注意:这是 GNU sed 特有的。它还使用了一个鲜为人知的习语,即用全局替换处理每一行,从而将换行符插入模式空间。调用
D
命令并删除直到第一个换行符(包括第一个换行符),但直到模式空间为空时才完成当前 sed 循环(这基本上是通过插入的每个换行符来压缩模式空间,如果行首与另一个正则表达式匹配,则应用括号内的表达式)。括号内的表达式。在保持空间中复制模式空间,交换到保持空间,格式化保持空间的开头以提供 2 个格式化的行,恢复到模式空间并咬合到下一个换行符,然后重复。
这是一个 非常 粗糙且现成的解决方案,可能无法满足可以通过 curl 命令返回的所有 HTML 的需求。
potong
2021-11-16
I have the following error " sed : file news.sed line 1: unknown options to 's'.
您在第三个脚本行的末尾有一个回车符(至少),由于它紧跟在
s/…/…/
命令后面,因此被解释为该命令的一个选项。您可以消除脚本文件中的 CR,例如使用
sed -i 's/\r//' news.sed
。
Armali
2021-11-16