0

我有一个项目要求,在搜索特定文本后需要打印文本的下一个字符。

为了更好地理解,这里举个例子。

我有一个index.html文件,想在搜索文本后打印一个特定的文本。

问题:我有文本<b>WELCOME</b>index.html现在我想搜索<b>,打印文本WELCOME直到</b>

bash# cat index.html | grep "" ?? 

请帮助我在 Linux 中使用 shell 命令或 shell 脚本打印此内容。

4

2 回答 2

0

您可以为此使用 sed:

sed -n -e 's/.*<b>\([^<]*\)<\/b>.*/\1/p' index.html

“-n”标志告诉 sed 只打印你告诉它的行。

“s”命令将用另一个字符串替换与正则表达式匹配的字符串。我将尝试解释正则表达式(regex):

  1. .*匹配一个字符序列
  2. <b>匹配相应的字符串
  3. \([^<]*\)稍微复杂一点。对于初学者,以反斜杠为前缀的括号告诉 sed 将匹配的内容存储到辅助变量中。[^<]匹配除字符之外的任何字符,<后面的星号表示它应该匹配它的序列(即不是的字符序列<)。
  4. <\/b>匹配</b>字符串,但我们必须用反斜杠转义斜杠字符,以免 sed 误以为它是正则表达式的结尾。
  5. .*匹配另一个字符序列

在正则表达式之后,一个字符串告诉 sed 使用什么作为替换。在这种情况下,它只是\1告诉 sed 打印第一个捕获组(即,在这种情况下,上面第 3 部分匹配的所有内容,这意味着和之间的所有内容<b></b>

最后在最后一个斜线之后,我们告诉 sed 打印带有“p”字符的替换行。如果一行与正则表达式不匹配,则不会打印,因为我们使用了上面的“-n”标志。

希望这会有所帮助=)

于 2012-09-29T19:58:11.950 回答
0

以快速而肮脏的方式打印当前页面标题的示例:

wget -q -O - 'http://tinyurl.com/9n6wayk' |
    sed -n '/<title>/{s:<title>\(.*\)</title>:\1:;p;q;}'

sed 命令详细说明:

  • -n选项仅显示匹配行
  • //开头的部分就像一个grep:我们使用匹配线
  • {}用来附上命令的
  • thes:::是一个替换(分隔符可以是任何字符,默认是/
  • 正在\(.*\)抓拍
  • \1 是捕获的字符串
  • p是否可以打印修改后的字符串
  • q匹配线后是否有退出

更简洁的方法是在 Python、Ruby 或 Perl 等第三代语言中使用Xpath

在当前 stackoverflow 页面的 shell 中使用 Xpath 的简单方法:

xmllint 2>/dev/null --html \
    --xpath '/html/head/title/text()' \
    http://tinyurl.com/9n6wayk

xmllintlibxml的一部分

于 2012-09-29T20:04:28.883 回答