我有一个项目要求,在搜索特定文本后需要打印文本的下一个字符。
为了更好地理解,这里举个例子。
我有一个index.html
文件,想在搜索文本后打印一个特定的文本。
问题:我有文本<b>WELCOME</b>
。index.html
现在我想搜索<b>
,打印文本WELCOME
直到</b>
。
bash# cat index.html | grep "" ??
请帮助我在 Linux 中使用 shell 命令或 shell 脚本打印此内容。
我有一个项目要求,在搜索特定文本后需要打印文本的下一个字符。
为了更好地理解,这里举个例子。
我有一个index.html
文件,想在搜索文本后打印一个特定的文本。
问题:我有文本<b>WELCOME</b>
。index.html
现在我想搜索<b>
,打印文本WELCOME
直到</b>
。
bash# cat index.html | grep "" ??
请帮助我在 Linux 中使用 shell 命令或 shell 脚本打印此内容。
您可以为此使用 sed:
sed -n -e 's/.*<b>\([^<]*\)<\/b>.*/\1/p' index.html
“-n”标志告诉 sed 只打印你告诉它的行。
“s”命令将用另一个字符串替换与正则表达式匹配的字符串。我将尝试解释正则表达式(regex):
.*
匹配一个字符序列<b>
匹配相应的字符串\([^<]*\)
稍微复杂一点。对于初学者,以反斜杠为前缀的括号告诉 sed 将匹配的内容存储到辅助变量中。[^<]
匹配除字符之外的任何字符,<
后面的星号表示它应该匹配它的序列(即不是的字符序列<
)。<\/b>
匹配</b>
字符串,但我们必须用反斜杠转义斜杠字符,以免 sed 误以为它是正则表达式的结尾。.*
匹配另一个字符序列在正则表达式之后,一个字符串告诉 sed 使用什么作为替换。在这种情况下,它只是\1
告诉 sed 打印第一个捕获组(即,在这种情况下,上面第 3 部分匹配的所有内容,这意味着和之间的所有内容<b>
)</b>
。
最后在最后一个斜线之后,我们告诉 sed 打印带有“p”字符的替换行。如果一行与正则表达式不匹配,则不会打印,因为我们使用了上面的“-n”标志。
希望这会有所帮助=)
以快速而肮脏的方式打印当前页面标题的示例:
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的一部分