CLo*_*Los 4 grep bash text-processing regular-expression html
我已经下载了一个由网页上的脚本自动生成的 html 文件。该文件包含多个链接,包括指向我试图提取图像全名的图像的链接,例如
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
Run Code Online (Sandbox Code Playgroud)
从上面我想"Image name.jpg"
存储在一个文件中。由于有数百个,我解析文件并存储每个名称,因为它出现以下命令:
grep -i -E -o "target=\"_blank\">([[:graph:]]*)\.(jpg|png|gif|webm)" "$thread" | cut -f 2 -d '>' | sed 's/ /_/g' - > "$names"
Run Code Online (Sandbox Code Playgroud)
其中“ $thread
”是html文件的名称,“ $names
”是作为输出的文件名列表。我使用“ cut
”删除'target="_blank">'
部分,然后将空格转换为下划线。
由于文件中还有其他几个链接,我指定了要抓取的扩展名(图像和 webm)。其他一切都应该被忽略。我已经到了它只抓取这些链接的地步,但是它错过了一些。
某些文件包含空格和非字母数字字符。如果我使用[[:print:]]
which 应该涵盖所有这些情况,我将一无所获,或者我得到了一些<head>
html 部分而什么也没有。如果我使用[[:graph:][:space:]]
,我也一无所获。如果我只是使用[[:graph:]]
(如上),或者[[:alnum:][:punct:]]
我可以获得带有字母数字/其他字符(如“ filenamewith(parenthesis).jpg
”)但不是空格的文件,反之亦然,[[:alnum:][:space:]]
可以使用但省略其他可打印字符(“ file name with spaces.jpg
”可以使用,但不能“与(括号、逗号或其他.jpg”)。
据说[[:print:]]
涵盖了所有情况,但我没有得到我需要的,如果我理解正确的话,
grep -E -o
应该只匹配(根据上述情况):
*.jpg *.png *.gif
或*.webm
我试过grep
有和没有-E/-o/-e
不同的变化。
有任何想法吗?我正在使用 Arch Linux、grep 2.20、bash 4.3.18
最好的策略是使用一个合适的 html 解析器,它可以输出所有<a>
标签的值。
这里,xmlstarlet
特别是一个 XML 解析器,您的 HTML 可能不是格式良好的 XML,但您可能会明白:
echo '<html>
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
</html>' | xmlstarlet sel -t -v //a
Run Code Online (Sandbox Code Playgroud)
Image name.jpg
Run Code Online (Sandbox Code Playgroud)