【问题标题】:bash syntax for regular expression正则表达式的 bash 语法
【发布时间】:2019-04-20 20:01:22
【问题描述】:

我无法在我的 bash 脚本中应用我测试过的正则表达式和分组。将正则表达式应用于变量分组的正确 bash 语法是什么?

我用正则表达式测试器测试了我的正则表达式并工作了。但我仍然无法用 bash 做到这一点。现在我或多或少地了解了正则表达式的工作原理,但我仍然需要知道它在脚本中的应用方式。

read_line="1- https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8  ==> movie name 1"
url=[[ "$read_line" =~ \d.*?(https.*?)==]] && echo "${BASH_REMATCH[1]}" #This syntax I copied from here. 

folder_name=[[ "$read_line" =~ ==>\s+(\w+.*) ]] && echo "${BASH_REMATCH[1]}"

实际结果应该是:

url : https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8
folder_name: movie name 1

【问题讨论】:

    标签: bash syntax


    【解决方案1】:

    试试:

    $ [[ "$read_line" =~ [0-9].*(https.*)== ]] && echo "${BASH_REMATCH[1]}"
    https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8  
    
    $ [[ "$read_line" =~ '==>'[[:space:]]+([[:alnum:]].*) ]] && echo "${BASH_REMATCH[1]}"
    movie name 1
    

    评论

    1. Bash 不支持\d\w 等字符类。 Bash 使用 POSIX 正则表达式。

    2. [[ ... ]] 设置错误代码但不返回字符串。因此,var=[[ ... ]] 之类的变量赋值没有用处。

    3. 使用[[]] 时,空格很重要。观察到这失败了:

      $ [[ 1=1]] && echo yes
      bash: conditional binary operator expected
      bash: syntax error near `yes'
      

      但这成功了:

      $ [[ 1 = 1 ]] && echo yes
      yes
      
    4. Bash (POSIX) 正则表达式始终匹配最长的匹配项。它们不支持非贪婪匹配,例如.*?

    分配值并捕获丢失的匹配项

    if [[ "$read_line" =~ '==>'[[:space:]]+([[:alnum:]].*) ]]
    then
        folder_name="${BASH_REMATCH[1]}"
    else
        echo "No Match"
    fi
    

    【讨论】:

    • [[ 1=1 ]] 有效,但并不意味着它的样子;请改用[[ 1 = 1 ]]。此外,要将匹配项分配给变量,请使用例如url="${BASH_REMATCH[1]}"。处理字符串 not 匹配的情况也很好。哦,RE 子表达式.*? 没有多大意义,也不适合我。请改用.*
    • @GordonDavisson 所有优秀的建议。谢谢你。答案已更新。
    • 感谢您的澄清。不,我知道那个 posix 正则表达式。现在该命令就像一个魅力一样工作。非常感谢。
    【解决方案2】:

    原始 bash 代码,

    url=[[ "$read_line" =~ \d.?(https.?)==]] && echo "${BASH_REMATCH[1]}"

    文件夹名称=[[ "$read_line" =~ ==>\s+(\w+.*) ]] && echo "${BASH_REMATCH[1]}

    包含 bash 正则表达式方面的错误;
    - [[ ]] 正则表达式在表达式中并不意味着 RHS 或正确的值,所以它会出错
    - 它没有速记功能; \w, \d, \s 等受 bash 正则表达式支持,必须执行 [A-Za-z_]、[0-9]、[] 等但是..
    - 幸运的是它支持 POSIX 类集\w by [[:alnum:]] \d by [[:digit:]] \s by [[:space:]] 等等,请参阅它的手册
    - 在重复运算符*+ 之后,它没有“惰性”量词功能?
    - 在正则表达式占位符 [[ ]] 中,一些 bash 特殊字符仍然适用,例如
    \ > | 必须转义为 \\ \> \| 以及关系运算符 == <=

    建议:
    获取/安装更好的正则表达式引擎,即。更好的编程语言,内置更好的正则表达式功能来完成这项工作。从sed, perl, awk等内部进行操作

    要达到目标,bash 脚本可能是;

    [[ "$read_line" =~ (https:.*)' '== ]] && url=${BASH_REMATCH[1]}
    [[ "$read_line" =~ ==\>[[:space:]]+([ [:alnum:]]+) ]]&& folder_name=${BASH_REMATCH[1]}
    

    【讨论】:

    • Abdan 也感谢您的详细解释。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2022-10-24
    • 2019-12-11
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多