Подтвердить что ты не робот

Как избежать одиночных кавычек в Bash/Grep?

Я хочу найти grep для строки, которая выглядит так:

something ~* 'bla'

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

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

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

4b9b3361

Ответ 1

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

работает для меня.

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

Ответ 2

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

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?'"'"'"'

Это не очень, но он работает.:)

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

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

: -)

Ответ 3

  • классы символов задаются с помощью [[:alnum:]] (две скобки)
  • [[:alnum:]] соответствует только символу один. Чтобы совместить ноль или более символов [[:alnum:]]*
  • вы можете просто использовать " " для цитирования регулярного выражения:

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

Маттео

Ответ 4

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

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

или

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