Как избежать одинарных кавычек в Bash / Grep? - PullRequest
26 голосов
/ 31 августа 2011

Я хочу найти с помощью grep строку, которая выглядит следующим образом:

something ~* 'bla'

Я пробовал это, но оболочка удаляет одинарные кавычки argh ..

grep -i '"something ~* '[:alnum:]'"' /var/log/syslog

Чтобудет правильный поиск?

Ответы [ 4 ]

42 голосов
/ 15 марта 2012

Если вам нужно нужно искать кавычки в кавычках в кавычках, то есть уродливые конструкции, которые это сделают.

echo 'And I said, "he said WHAT?"'

работает как положено, но для другого уровня вложенности, следующее не работает как положено:

echo 'She said, "And I said, \'he said WHAT?\'"'

Вместо этого вам нужно избегать внутренних одинарных кавычек за пределами строки в одинарных кавычках:

echo 'She said, "And I said, '\''he said WHAT?'\''"'

Или, если вы предпочитаете:

echo 'She said, "And I said, '"'"'he said WHAT?'"'"'"'

Это не красиво, но работает. :)

Конечно, все это спорный вопрос, если вы положили вещи в переменных.

[ghoti@pc ~]$ i_said="he said WHAT?"
[ghoti@pc ~]$ she_said="And I said, '$i_said'"
[ghoti@pc ~]$ printf 'She said: "%s"\n' "$she_said"
She said: "And I said, 'he said WHAT?'"
[ghoti@pc ~]$ 

: -)

13 голосов
/ 31 августа 2011
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog

у меня работает.

  • экранирует первый *, который соответствует литералу *, вместо того, чтобы делать его равным нулю или больше совпадений:
    ~* будет соответствовать нулю или более вхождений ~, в то время как
    ~\* соответствует выражению ~* после something
  • используйте двойные скобки вокруг :alnum: (см. Пример здесь )
  • используйте * после [[:alnum::]] для сопоставления не только одного символа между вашими одинарными кавычками, но и нескольких из них
  • одиночные кавычки вообще не нужно экранировать, поскольку они содержатся в выражении, ограниченном двойными кавычками.
1 голос
/ 31 августа 2011
  • классы символов указываются с помощью [[:alnum:]] (две скобки)
  • [[:alnum:]] соответствует только один символ.Чтобы найти ноль или более символов [[:alnum:]]*
  • , вы можете просто использовать " ", чтобы процитировать регулярное выражение:

    grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
    

Matteo

0 голосов
/ 31 августа 2011

По вашему выражению кажется, что вы используете сначала ', а затем ".Если вы хотите избежать одиночных кавычек, вы можете либо использовать ' и избегать их, либо использовать двойные кавычки.Кроме того, как комментирует Маттео, классы символов имеют двойные квадратные скобки: либо

grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog

, либо

grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...