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 ->.
所以请建议修复它?
答案 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