我有一个项目要求,在搜索特定文本后需要打印文本的下一个字符。
为了更好地理解,这是一个例子。
我有index.html
个文件,想在搜索文本后打印特定文字。
问题:<b>WELCOME</b>
中有index.html
字样。现在我要搜索<b>
,打印文本WELCOME
直到</b>
。
bash# cat index.html | grep "" ??
请帮我在Linux中使用shell命令或shell脚本打印此内容。
答案 0 :(得分:0)
你可以使用sed:
sed -n -e 's/.*<b>\([^<]*\)<\/b>.*/\1/p' index.html
“-n”标志告诉sed只打印你告诉它的行。
“s”命令将替换与正则表达式匹配的字符串与另一个字符串。我将尝试解释正则表达式(正则表达式):
.*
匹配一系列字符<b>
匹配相应的字符串\([^<]*\)
稍微复杂一些。对于初学者,前缀为反斜杠的括号告诉sed将它匹配的内容存储到辅助变量中。 [^<]
匹配除<
字符以外的任何字符,后面的星号表示它应该匹配它的序列(即不是<
的字符序列)。 <\/b>
匹配</b>
字符串,但我们必须使用反斜杠转义斜杠字符,以免混淆sed认为它是正则表达式的结尾。.*
匹配另一个字符序列在正则表达式之后,一个字符串告诉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:::
是替换(分隔符可以是任何字符,默认字符为/
)\(.*\)
正在进行捕获p
用于打印修改后的字符串q
是在匹配行更简洁的方法是在Python,Ruby或Perl等第三代语言中使用Xpath。
在当前stackoverflow页面上使用shell中的Xpath的简单方法:
xmllint 2>/dev/null --html \
--xpath '/html/head/title/text()' \
http://tinyurl.com/9n6wayk
xmllint
是libxml