【问题标题】:Quoting regular expressions in Bash [duplicate]在 Bash 中引用正则表达式 [重复]
【发布时间】:2014-05-12 08:40:23
【问题描述】:

我正在尝试编写一个适合所有以空格/制表符和单词 Path 开头的行的条件

/sPath.* - simple regexp?

我发现在 Bash 4.* 中应该是这样的:

if [[ $LINE =~ "[[:space:]]Path" ]]

但由于某种原因,这种情况不起作用。

if [[ $LINE =~ [[:space:]] ]]

工作正常,并显示所有带空格/制表符的行。

【问题讨论】:

    标签: regex bash


    【解决方案1】:

    来自version 3.2 onwards,模式(即正则表达式)不得在 Bash 中引用:

    1. Bash 中的新功能

    ...

    f。现在将字符串参数引用到 [[ 命令的 =~ 运算符 强制字符串匹配,与其他模式匹配运算符一样。

    换句话说,引号被认为是正则表达式本身的一部分(文字")。

    另外,最好引用变量$LINE,以防止它为空时出错:

    if [[ "$LINE" =~ [[:space:]] ]]
    

    【讨论】:

    • 如果[[ ... ]] 中没有引用$LINE 会发生什么错误?
    • 如果我匹配字符串 [[:blank:]]Path* where * - 任何符号?
    【解决方案2】:

    最好用:

    [[ "$LINE" =~ [[:blank:]] ]]
    
    1. 引用变量LINE
    2. 匹配字符类[[:blank:]],相当于空格或制表符

    【讨论】:

    • 为什么引用变量更好?
    • 如果我匹配字符串 [[:blank:]]Path* where * - 任何符号?
    • 您可以使用:[[ "$LINE" =~ [[:blank:]]"Path" ]]
    • @choroba:这是因为$LINE在开头包含空格
    • @choroba:由于字段拆分(令牌),引用可能很有用,例如[[ a␣␣␣b =~ "a␣␣␣b" ]](将 替换为空格)。
    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2010-09-18
    • 2020-12-23
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多