如何使用sed获取所有链接到其他文件

时间:2014-12-24 11:53:34

标签: regex shell sed command

我有一个像这样的详细信息的文件

    <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开头的链接,而不是以数字开头。我该怎么办?

4 个答案:

答案 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