Mic*_*l J 3 perl awk grep sed command-line-interface
我正在尝试从HTML输出中获取如下所示的数据:
<strong>Target1NoSpaces</strong><span class="creator"> ....
<strong>Target2 With Spaces</strong><span class="creator"> ....
Run Code Online (Sandbox Code Playgroud)
我正在使用管道列车将数据削减到我想要击中的目标.到目前为止,这是我的方法:
grep "/strong" output.html | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
grep on"/ strong"以获得目标线; 工作正常.
管道'awk'{print $ 1}'.当目标没有空格时,#1适用于#1;但当目标有空格时,#2情况下失败.只有第一个单词保留如下:
<strong>Target1NoSpaces</strong><span
<strong>Target2
Run Code Online (Sandbox Code Playgroud)
你有没有关于正确击中目标的提示,无论是在我的awk还是在不同的命令中?任何快速和肮脏的东西(grep,awk,sed,perl)都会受到赞赏.
ken*_*orb 10
Try pup,一个用于处理 HTML 的命令行工具。例如:
$ pup 'strong text{}' < file.html
Target1NoSpaces
Target2 With Spaces
Run Code Online (Sandbox Code Playgroud)
要通过 XPath 搜索,请尝试xpup.
或者,对于格式良好的 HTML/XML 文档,请尝试html-xml-utils.
在 grep 中使用 Perl 正则表达式的后视和前瞻功能。它应该比使用 awk 更简单。
grep -oP "(?<=<strong>).*?(?=</strong>)" file
Run Code Online (Sandbox Code Playgroud)
输出:
Target1NoSpaces
Target2 With Spaces
Run Code Online (Sandbox Code Playgroud)
添加:
Perl 的正则表达式在 Ruby 中的多重匹配的这种实现可以匹配多行中的值:
ruby -e 'File.read(ARGV.shift).scan(/(?<=<strong>).*?(?=<\/strong>)/m).each{|e| puts "----------"; puts e;}' file
Run Code Online (Sandbox Code Playgroud)
输入:
<strong>Target
A
B
C
</strong><strong>Target D</strong><strong>Target E</strong>
Run Code Online (Sandbox Code Playgroud)
输出:
----------
Target
A
B
C
----------
Target D
----------
Target E
Run Code Online (Sandbox Code Playgroud)
使用mojolicious及其DOM解析器的一种方法:
perl -Mojo -E '
g("http://your.web")
->dom
->find("strong")
->each( sub { if ( $t = shift->text ) { say $t } } )'
Run Code Online (Sandbox Code Playgroud)