代码之家  ›  专栏  ›  技术社区  ›  D S

试图弄清楚为什么带有awk/read的bash代码在另一台设备上不起作用

  •  0
  • D S  · 技术社区  · 5 月前

    我试图弄清楚为什么下面的代码在另一台设备上不起作用。你知道有什么问题吗?

    文件“搜索”是一个包含多个href条目的html代码:

    <a class="movieTitleCat" tytul="Godzilla: Król potworów"  id="14220" href="napisy-14220-Godzilla-Król-potworów-(1954)"><h3>Godzilla: Król potworów (Gojira) - 1954r. </h3></a>
    

    脚本:

    #!/bin/bash
    read -r -d "" awkCode << 'SEARCHTITLEAWKEOF'
    /movieTitleCat/ {
        match($0, /href="([^"]*)"/, cHref)
        printf("%s\n", (napiBase "/" cHref[1]))
    }
    SEARCHTITLEAWKEOF
    
    cat /home/gato/search | awk -v napiBase="http://lalalala.com" "$awkCode"
    
    
    $ bash ttt.sh 
    http://lalalala.com/napisy-14220-Godzilla-Król-potworów-(1954)
    http://lalalala.com/napisy-6336-Godzilla-(1984)
    http://lalalala.com/napisy-17864-Godzilla-kontra-Gigan-(1972)
    http://lalalala.com/napisy-12747-Powrót-Godzilli-(1999)
    http://lalalala.com/napisy-21140-Godzilla-kontra-Mothra-(1992)
    http://lalalala.com/napisy-21144-Godzilla-kontra-Kosmogodzilla-(1994)
    http://lalalala.com/napisy-14424-Godzilla-kontra-Megaguirus-(2000)
    http://lalalala.com/napisy-11423-Godzilla-kontra-Destruktor-(1995)
    http://lalalala.com/napisy-17799-Godzilla-kontra-Hedora-(1971)
    http://lalalala.com/napisy-19933-Godzilla-kontra-Mechagodzilla-2-(1993)
    http://lalalala.com/napisy-18110-Godzilla-kontra-Mothra-(1964)
    http://lalalala.com/napisy-3389-Godzilla-kontra-Mechagodzilla-(1974)
    http://lalalala.com/napisy-20161-Godzilla-Mothra-król-Ghidora-Gigantyczne-potwory-atakują-(2001)
    http://lalalala.com/napisy-21282-Godzilla-kontra-Mechagodzilla-III-(2002)
    http://lalalala.com/napisy-55497-Godzilla-II-Król-potworów-(2019)
    

    这里它在另一台设备上不起作用,href=“

    bash /home/pm/tttt.sh 
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    http://lalalala.com/
    bash --help
    GNU bash, version 4.4.0(4)-release-(aarch64-unknown-linux-gnu)
    
    2 回复  |  直到 5 月前
        1
  •  1
  •   Arkadiusz Drabczyk    5 月前

    你的代码在另一台设备上不起作用的原因不是 Bash的不同版本,但awk的较小实现。如果你 在脚本中使用--posix参数运行awk,如下所示:

    cat search | awk --posix -v napiBase="http://lalalala.com" "$awkCode"
    

    它会说:

    awk: cmd. line:2:     match($0, /href="([^"]*)"/, cHref)
    awk: cmd. line:2:                                      ^ match: third argument is a gawk extension
    

    您需要更改引用数组的AWK行:

    match($0, /href="([^"]*)"/, cHref)cHref[1]))
    printf("%s\n", (napiBase "/" cHref[1]))
    

    与此:

    match($0, /href="([^"]*)"/)
    printf("%s\n", (napiBase "/" substr($0, RSTART + 6, RLENGTH - 7)))
    
        2
  •  0
  •   Daweo    5 月前
    #!/bin/bash
    read -r -d "" awkCode << 'SEARCHTITLEAWKEOF'
    /movieTitleCat/ {
        match($0, /href="([^"]*)"/, cHref)
        printf("%s\n", (napiBase "/" cHref[1]))
    }
    SEARCHTITLEAWKEOF
    
    cat /home/gato/search | awk -v napiBase="http://lalalala.com" "$awkCode"
    

    String Functions

    match(string, regexp [, array])

    (...)

    数组参数 match() 是一个gawk扩展。(...)

    所以你需要GNU AWK 以使用所述脚本。如果可用,但不是默认值,则应该足够替换

    cat /home/gato/search | awk -v napiBase="http://lalalala.com" "$awkCode"
    

    使用

    cat /home/gato/search | gawk -v napiBase="http://lalalala.com" "$awkCode"
    

    否则,您需要重新编写命令。尽管如此,请注意awk不太适合处理HTML,如果可能的话,请使用HTML感知工具从HTML文档中提取数据,例如。 hxselect