我正在编写一个脚本,它将html页面源作为文件下载,然后读取该文件并提取位于特定代码之后的特定URL。 (它只有1次出现)
以下是我需要匹配的示例:
<img id="sample-image" class="photo" src="http://xxxx.com/some/ic/pic_1asda963_16x9.jpg"
URL之前的代码将始终相同,因此我需要在以下之间提取部分:
<img id="sample-image" class="photo" src="
URL后面的和"
。
我尝试了像这样的sed:
sed -n '\<img\ id=\"sample-image\"\ class=\"photo\"\ src=\",\"/p' test.txt
但它不起作用。非常感谢您的建议,非常感谢!
答案 0 :(得分:3)
您可以像这样使用grep:
grep -oP '<img\s+id="sample-image"\s+class="photo"\s+src="\K[^"]+' test.txt
或sed:
sed -r 's/<img\s+id="sample-image"\s+class="photo"\s+src="([^"]+)"/\1/' test.txt
或awk:
awk -F'src="' -F'"' '/<img\s+id="sample-image"/{print $6}' test.txt
答案 1 :(得分:3)
如果您有GNU
grep,那么您可以执行以下操作:
grep -oP "(?<=src=\")[^\"]+(?=\")" test.txt
如果您希望使用awk
,则以下内容可行:
awk -F\" '{print $(NF-1)}' test.txt
答案 2 :(得分:1)
使用sed作为
echo $string | sed 's/\<img.*src="\(.*\)".*/\1/'
答案 3 :(得分:1)
您正在使用的sed
命令的一些内容:
sed -n '\<img\ id=\"sample-image\"\ class=\"photo\"\ src=\",\"/p' test.txt
您无需转义<
,"
或空格。单引号可以防止shell在sed
表达式上进行分词和其他内容。
你基本上是这样做sed -n '/pattern/p' test.txt
(除了你好像缺少开头反斜杠),说“匹配这个模式,然后打印包含匹配的行”,你实际上并没有提取URL。
这是次要的,但您不需要匹配class="photo"
,因为id
已经使HTML元素唯一(在同一HTML中没有两个元素共享相同的ID) )。
这就是我要做的事情
sed -n 's/.*<img id="sample-image".*src="\([^"]+\)".*/\1/p' test.txt
p
标志告诉sed
打印执行替换(s
)的行。
\(pattern\)
捕获一个子表达式,可以通过\1
s///
等进行访问>
正则表达式开头的.*
以防在行上<img>
元素之前还有其他内容(您确实提到要解析HTML文件)