我有一个像这样的详细信息的文件
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535582622303.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535573574287.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635438897530827768.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
我使用此命令
grep 'hasURL.*' inputfile.txt | sed 's/^.*CDATA\\[\\([^>]\\+\\)]].*$/\\1/g' > output.txt
将CDATA[]
中的所有链接都输出到output.txt。
现在,我希望只获得以http
开头的链接,而不是以数字开头。我该怎么办?
答案 0 :(得分:2)
这可能适合你(GNU sed):
sed -n '/hasURL/s/.*CDATA\[\(http[^]]*\)\].*/\1/p' file
这会启用seds grep-like处理,将行限制为包含hasURL
的行,并获取CDATA[http...]
内的所有详细信息。
答案 1 :(得分:1)
我认为最直接的扩展是使用
sed -n 's/^.*CDATA\[\([^>]\+\)]].*$/\1/g; /^http/ p'
也就是说,只需将/^http/ p
添加到sed脚本并使用-n
调用sed即可。然后它只会打印替换结果,如果匹配^http
。
答案 2 :(得分:1)
试试这个awk版本并获得结果
awk -F[ '$3 ~ /^http/{sub("]+.*","",$3);print $3 }'
答案 3 :(得分:0)
首先使用sed搜索条件。
grep 'hasURL.*' inputfile.txt | sed -n '/CDATA\[http:\/\//s~^.*CDATA\[\([^>]\+\)\]\].*$~\1~p'
示例:强>
$ cat yi
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535582622303.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535573574287.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635438897530827768.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
$ sed -n '/CDATA\[http:\/\//s~^.*CDATA\[\([^>]\+\)\]\].*$~\1~p' yi
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535582622303.JPG
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535573574287.JPG
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635438897530827768.JPG
/CDATA\[http:\/\//
正则表达式模式将搜索包含CDATA[http://
的行,并仅在这些行上进行替换,即它将这些行中的所有字符替换为组索引1中的字符。 / p>
或强>
如果你的grep支持-P
,那么你可以通过grep本身来做到这一点。
grep -oP '^(?=.*hasURL).*CDATA\[\Khttp://\S+?(?=\s*]])' file
示例:强>
$ cat file
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535582622303.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535573574287.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635438897530827768.JPG ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
<hasURL rdf:datatype="&xsd;string"><![CDATA[192.168.1.1 ]]></hasURL>
foo
bar
$ grep -oP '^(?=.*hasURL).*CDATA\[\Khttp://\S+?(?=\s*]])' file
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535582622303.JPG
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635453535573574287.JPG
http://media.foody.vn/res/g4/36211/s/foody-dragon-beach-bar-635438897530827768.JPG