【问题标题】:Regex is not matching for shell script: sed 's| *MOVE *\([^ ]*\) .*|\1|正则表达式与 shell 脚本不匹配:sed 's| *移动 *\([^ ]*\) .*|\1|
【发布时间】:2018-11-27 10:37:22
【问题描述】:

我遇到了一个很奇怪的问题,下面是带有 sed 命令的 shell 脚本:

rec="001  MOVE 'N'    TO abcdefgef"
vname=`sed 's| *MOVE *\([^ ]*\) .*|\1|' <<<$rec`
echo "vname=$vname"

输出: vname=001'N'

我希望它只是'N'而不是 001'N'。 有人可以解释为什么 001 会输出吗?如果常规 exp 不匹配,我应该将 gettign 完整字符串作为输出。如果 001 匹配,它怎么会漏掉 MOVE 字呢?

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:
    $ rec="001  MOVE 'N'    TO abcdefgef"
    $ echo "$rec" | sed 's| *MOVE *\([^ ]*\) .*|\1|'
    001'N'
    $ echo "$rec" | sed 's|.* *MOVE *\([^ ]*\)|\1|'
    'N'    TO abcdefgef
    
    $ echo "$rec" | sed 's|.* *MOVE *\([^ ]*\) .*|\1|'
    'N'
    $ echo "MOVE 'N'    TO" | sed 's|.* *MOVE *\([^ ]*\) .*|\1|'
    'N'
    

    就像您在捕获所需字符串后添加.* 以匹配其余行一样,您需要在MOVE... 之前添加.* 以匹配字符串


    此外,您可能希望匹配MOVE 之后的空格,而不是使其成为可选

    $ echo "MOVED TO" | sed 's|.* *MOVE *\([^ ]*\) .*|\1|'
    D
    $ echo "MOVED TO" | sed 's|.* *MOVE \([^ ]*\) .*|\1|'
    MOVED TO
    

    【讨论】:

      【解决方案2】:

      您可以在 bash 中进行正则表达式匹配:

      rec="001  MOVE 'N'    TO abcdefgef"
      regex='MOVE *([^ ]+)'
      [[ $rec =~ $regex ]] && declare -p BASH_REMATCH
      
      declare -ar BASH_REMATCH='([0]="MOVE '\''N'\''" [1]="'\''N'\''")'
      

      "BASH_REMATCH" is an array,如果匹配成功,将填充匹配的文本(在数组索引 0 中)和捕获的正则表达式部分(在后续索引中)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 2018-12-30
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        相关资源
        最近更新 更多