开发者问题收集

如何使用 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