Я хочу найти grep для строки, которая выглядит так:
something ~* 'bla'
Я пробовал это, но оболочка удаляет одинарные кавычки argh..
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
Каким будет правильный поиск?
Я хочу найти grep для строки, которая выглядит так:
something ~* 'bla'
Я пробовал это, но оболочка удаляет одинарные кавычки argh..
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
Каким будет правильный поиск?
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
работает для меня.
*
, чтобы он соответствовал литералу *
вместо того, чтобы сделать его символом с нулевым или большим совпадением: ~*
будет соответствовать нулю или больше вхождений ~
, а
~\*
соответствует выражению ~*
после something
:alnum:
(см. пример здесь)*
после [[:alnum::]]
, чтобы соответствовать не только символу один между вашими одиночными кавычками, но несколькими из нихЕсли вам нужно искать кавычки в кавычках в кавычках, есть уродливые конструкции, которые это сделают.
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] ~]$
: -)
[[:alnum:]]
(две скобки)[[:alnum:]]
соответствует только символу один. Чтобы совместить ноль или более символов [[:alnum:]]*
вы можете просто использовать " "
для цитирования регулярного выражения:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
Маттео
По вашему выражению кажется, что вы используете сначала '
, а затем "
. Если вы хотите избежать одиночных кавычек, вы можете использовать '
и избежать их или использовать двойные кавычки. Кроме того, как комментирует Маттео, классы персонажей имеют двойные квадратные скобки. Либо:
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
или
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog