如何在shell脚本中搜索完全匹配,排除匹配前后的字符?

时间:2017-02-20 02:38:23

标签: bash shell unix awk

 awk '/[a-z]\+|\+[a-z]/{print NR, echo ":", $0, echo "[SHOULD BE IN FORMAT  [<space>operator<space>]"}' file.txt

我有一些要求,比如在任何操作符应该通过shell中的错误之前或之后没有空格。所以我想出了类似的东西:

  • 如果+之前没有空格,或+之后没有空格通过该消息。

  • 但如果我为-运营商做同样的情况,例如

    awk '/[a-z]\-|\-[a-z]/{print NR, echo ":", $0, echo "[SHOULD BE IN FORMAT [<space>operator<space>]"}' file.text
    

    虽然它适用于以下情况:[ a-b, a -b, a- b ]但在以下情况下失败,如

  • 如果在file.text中有一些像

    这样的行
    /*
        this->name = "string" 
    */
    //here it is showing the message like  echo "[SHOULD BE IN FORMAT [<space>operator<space>]"}' which is not desired because it is also searches for - in ->.
    

所以请建议修复它?

2 个答案:

答案 0 :(得分:1)

您可以搜索字符串 - &gt;在上述匹配之前,将其替换为不会使测试失败的内容。 (就像空间角色一样)。

答案 1 :(得分:0)

使用($0!~ /(.*\->.*)/)排除包含->

的行
awk ' \
   ($0~/([a-z]\-|\-[a-z])/) && ($0!~ /(.*\->.*)/)                                 \
   {print NR, echo ":", $0, echo "[SHOULD BE IN FORMAT [<space>operator<space>]"} \
' file.txt

但是,只有当你没有像a->exp = r-j这样的东西时,这才有效:行将被永远排除。否则,在检查您的模式之前,使用sub->替换为..;试试这个:

awk ' { \
   tmp_line = $0 ;                                                                \
   sub("->", "..", tmp_line) ;                                                    \
   if ( tmp_line ~/([a-z]\-|\-[a-z])/)                                            \
   {print NR, echo ":", $0, echo "[SHOULD BE IN FORMAT [<space>operator<space>]"} \
  } ' file.txt