regex
  • bash
  • sed
  • wget
  • multiline
  • 2016-10-28 54 views 3 likes 
    3

    我有一个文件中的URL列表(每行=不同的域)我想扫描(不递归),并选择两个模式,这是在不同的行。经过努力2天 - 我的头在旋转......grep multiline pattern

    这是很重要的HTML部分:

    <a href="http://subdomain.domain.tld/">Home</a> 
    </li> 
    <li> 
    <a data-uv-trigger='true' href='mailto:[email protected]'> 
    

    我需要选择域(subdomain.domain.tld)和电子邮件ADRESS(约翰福音@ doe.com)。我可以通过两步来(wget/sed)这些零件。

    wget -O - -i urls-to-scan-manuell.txt | sed -n "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" 
    
    wget -O - -i urls-to-scan-manuell.txt | sed -n "s/\(.*true' href='mailto\)\(.*\)\('>.*\)/\2/p" 
    

    但我想一次选择两个部分,并将它们写入到一行文件中,并用空格(空格)分隔。这是sed的多行东西,让我疯狂。

    请:我需要你的帮助,你会:)

    谢谢你在前进, 赖。

    回答

    2

    备案:这是not recommended to parse HTML using regex


    您可以使用sed-e多个表达式,可以帮助这里:

    wget -O - -i urls-to-scan-manuell.txt | sed -n \ 
        -e "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" \ 
        -e "s/\(.*true' href='mailto\)\(.*\)\('>.*\)/\2/p" 
    

    这将产生两行,一个域,一个用于电子邮件。 如果您更喜欢一条线上的输出,则可以管道到paste - -。缺省的分隔符是TAB,您可以更改与-d标志,因此,例如:

    wget -O - -i urls-to-scan-manuell.txt | sed -n \ 
        -e "s/\(.*a href=\"\)\(.*\)\(\">Home.*\)/\2/p" \ 
        -e "s/\(.*true' href='mailto:\)\(.*\)\('>.*\)/\2/p" | \ 
    paste -d, - - 
    

    会产生:

    http://subdomain.domain.tld/,[email protected] 
    

    我冒昧和mailto后添加一个:在这种模式下, ,因为我猜那是你的意图。

    +0

    Arf,我在'sed'的末尾和'paste'之前忘了管道符号'|'。现在添加它,检查我的更新。 – janos

    相关问题