Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用grep、sed或awk在匹配后获取上一个href_Bash_Awk_Sed - Fatal编程技术网

Bash 使用grep、sed或awk在匹配后获取上一个href

Bash 使用grep、sed或awk在匹配后获取上一个href,bash,awk,sed,Bash,Awk,Sed,我有一个未格式化的html文件,需要在匹配之前获取href链接。。。我的html文件看起来像: <a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a> 我真的很感谢你的帮助 谢谢这应该可以: sed -n 's/.*href="

我有一个未格式化的html文件,需要在匹配之前获取href链接。。。我的html文件看起来像:

<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>
我真的很感谢你的帮助

谢谢

这应该可以:

sed -n 's/.*href="\([^"]*\)">.*\[Test2\].*/\1/p' file
url2.com
使用GNU grep:

grep -oP '(?<=href=")[^"]*(?=">[^<>]*\[Test2\])' file
url2.com
grep-oP'(?这应该可以:

sed -n 's/.*href="\([^"]*\)">.*\[Test2\].*/\1/p' file
url2.com
使用GNU grep:

grep -oP '(?<=href=")[^"]*(?=">[^<>]*\[Test2\])' file
url2.com

grep-oP'(?
$awk-F'[\\]”]“{for(i=1;i
$awk-F'[\\]”]”{for(i=1;i使用带PCRE的
grep
):

  • href=“
    在所需URI之前匹配,
    \K
    放弃匹配

  • [^”]+
    获取所需的部分

  • 零宽度正向前瞻模式,
    (?=“[^[]+\[Test2\])
    ,确保匹配后面紧跟方括号中的任何内容,但
    [Test2]


使用sed的类似逻辑:

sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' file.html

示例:

$ grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>' 
url2.com

$ sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>'
url2.com

$grep-Po'href=“\K[^”]+(?=”[^[]+\[Test2\])”使用带PCRE的
grep
-p
):

  • href=“
    在所需URI之前匹配,
    \K
    放弃匹配

  • [^”]+
    获取所需的部分

  • 零宽度正向前瞻模式,
    (?=“[^[]+\[Test2\])
    ,确保匹配后面紧跟方括号中的任何内容,但
    [Test2]


使用sed的类似逻辑:

sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' file.html

示例:

$ grep -Po 'href="\K[^"]+(?="[^[]+\[Test2\])' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>' 
url2.com

$ sed -E 's/.*[[:blank:]]href="([^"]+)"[^[]+\[Test2\].*/\1/' <<<'<a href="url1.com">Bla Bla Bla [Test1]</a><a href="url2.com">Bla Bla Bla [Test2]</a><a href="url3.com">Bla Bla Bla [Test3]</a>'
url2.com

$grep-Po'href=“\K[^”]+(?=”[^[]+\[Test2\])“一般来说,使用需要行分隔数据的工具来处理非行分隔的数据(如XML)不是一个好主意。请改用
xmlstarlet
之类的工具。@MichaelVehrs:html似乎被缩小了……一般来说,使用需要行分隔的工具来处理非行分隔的数据(如XML)不是一个好主意。”行分隔的数据。请使用类似于
xmlstarlet
的内容。@MichaelVehrs:html似乎缩小了。。。