【问题标题】:How to print titles of a website with sed如何使用 sed 打印网站的标题
【发布时间】:2021-12-26 17:05:05
【问题描述】:

我目前正在编写一个 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 解析器。

【问题讨论】:

  • 顺便说一句 news.sed 是我的文件名,我必须打印来自网站 news.ycombinator.com 的标题。我还必须使用以下命令进行测试: curl -s news.ycombinator.com | sed -n -f news.sed
  • 您正在解析的文本中有斜线。你应该使用different delimiter,比如|
  • 你的意思是我应该使用 !s |而不是 !s / 和下面的行相同?
  • 是的。 | 是一个示例,但是,如果您遇到相同的错误,请尝试输入中未使用的另一个分隔符。此外,在您的命令中到处使用相同的分隔符(例如!s|...|...|P;D
  • 我已尝试更换,但无法正常工作。我仍然收到相同的错误消息

标签: shell sed


【解决方案1】:

这可能对你有用(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 循环(这基本上会通过插入的每个换行符以及如果行的开头与另一个换行符匹配模式空间regexp 应用括号表达式)。括号中的表达式。在保持空间中复制模式空间,交换到保持空间,格式化保持空间的开头以提供 2 条格式化的行,恢复到模式空间并切入下一个换行符,然后重复。

这是一个非常粗略且现成的解决方案,可能无法满足可通过 curl 命令返回的所有 HTML。

【讨论】:

  • 感谢您的帮助。但是它没有编译,我有以下错误消息:“sed:文件 news.sed 第 6 行:'s' 命令的 RHS 上的无效引用 \1”。我不知道如何解决它,但也许你可以。再次感谢您的宝贵时间
  • @heyman 你在使用 GNU sed 吗?在终端验证类型sed --version。您是否设置了-E 选项?
  • 我使用 GNU sed 4.8。当您说设置 -E 选项时,您是什么意思?我刚刚完全按照您发布的代码尝试了您的代码。我在其中没有添加或删除任何内容。
【解决方案2】:

我有以下错误“ sed : file news.sed line 1: unknown options to 's'。

您在第三个脚本行的末尾有一个回车符(至少),因为它紧跟在s/…/…/ 命令之后,所以被解释为它的一个选项。您可以消除脚本文件 e 中的 CR。 G。 sed -i 's/\r//' news.sed

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2016-03-25
    • 2019-11-08
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多