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

У меня есть какое-то требование, например, если нет места до или после того, как любой оператор должен через ошибку в оболочке. Так что я придумал что-то вроде этого:Как найти точное совпадение в скрипте оболочки, которое исключает символы до и после матча?

  • если нет пробела перед + или нет места после + будет через сообщение.

  • Но если я делаю тот же случай для - оператора как

    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

Вы можете найти строку -> перед указанными совпадениями и заменить ее чем-то, что не подведет тест. (например, символ пробела).

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 
Смежные вопросы