如何搜索特定文本并回显该特定文本的下一个字符?

时间:2012-09-29 18:24:01

标签: html linux bash command-line

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

为了更好地理解,这是一个例子。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

你可以使用sed:

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

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

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

  1. .*匹配一系列字符
  2. <b>匹配相应的字符串
  3. \([^<]*\)稍微复杂一些。对于初学者,前缀为反斜杠的括号告诉sed将它匹配的内容存储到辅助变量中。 [^<]匹配除<字符以外的任何字符,后面的星号表示它应该匹配它的序列(即不是<的字符序列)。
  4. <\/b>匹配</b>字符串,但我们必须使用反斜杠转义斜杠字符,以免混淆sed认为它是正则表达式的结尾。
  5. .*匹配另一个字符序列
  6. 在正则表达式之后,一个字符串告诉sed使用什么作为替换。在这种情况下,它只是\1告诉sed打印第一个捕获组(即,在以下情况下,上面第3部分匹配的所有内容,这意味着<b></b>之间的所有内容)。

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

    希望这有助于=)

答案 1 :(得分:0)

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

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

详细说明了sed命令:

  • -n选项仅显示匹配的行
  • 开头的//部分就像grep:我们使用匹配的行
  • {}用于包含命令
  • s:::是替换(分隔符可以是任何字符,默认字符为/
  • \(.*\)正在进行捕获
  • \ 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

的一部分