如何在Linux shell下做中文字符串的匹配

假如我有字符串 A,
A="米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝"
我想过滤它是否含有某个中文字符,比如“牛肉" ,使用

test.sh

#!/bin/bash
set -x

A="米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝"
F="牛肉"

if [ `echo "$A" |egrep "$F" ` ] ; then echo "A include $F"  ;fi

出现以下错误:

$ ./test.sh
+ A='米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝'
+ F=$'\347\211\233\350\202\211'
++ egrep $'\347\211\233\350\202\211'
++ echo '米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝'
+ '[' $'\347\261\263\351\245\255' + $'\347\210\206\347\202\222\347\211\233\350\202\211' + $'\350\261\211\346\261\201\350\202\211\347\211\207' + $'\350\222\234\350\223\211\350\212\245\350\223\235' ']'
./test.sh: line 7: [: too many arguments

是不是应该在哪个环境变量设置一下。

阅读 12.6k
评论
    3 个回答
    export LANG=zh_CN.UTF-8
    A="米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝"
    B="牛肉"
    F="毛线"
    echo $A | grep "$B" &>/dev/null
    if [[ $? == 0 ]]; then
       echo $B Match
    fi
    echo $A | grep "$F" &>/dev/null
    if [[ $? == 0 ]]; then
       echo $F Match
    fi
    

    你看看咯

    另外,确实使用bash的匹配更方便

    if [[ "$A" =~ "$B" ]]; then
       echo Match ${BASH_REMATCH[0]}
    fi
    

    有时候胜过sed的分组捕获,bash的匹配用起来更简单,也支持分组捕获,结果保存在BASH_REMATCH数组中

      使用 =~ bash里的字符串匹配方法解决了这个问题。

      cat test.sh
      #!/bin/bash
      set -x
      
      A="米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝"
      F="牛肉"
      
      if [[ $A =~ $F ]] ; then echo "A include $F"  ;fi
      
      
      $ ./test.sh
      + A='米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝'
      + F=$'\347\211\233\350\202\211'
      + [[ 米饭 + 爆炒牛肉 + 豉汁肉片 + 蒜蓉芥蓝 =~ 牛肉 ]]
      + echo 'A include 牛肉'
      A include 牛肉
      
        if echo "$A" |egrep "$F" &>/dev/null ; then echo "A include $F" ;fi
        

        不应该有[]
        另外这个出错信息很奇怪。理应当出现

        [: missing `]'
        

          撰写回答

          登录后参与交流、获取后续更新提醒