我想用 grep 搜索如下所示的字符串:
something ~* 'bla'
我尝试过这个,但是 shell 删除了单引号。啊……
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
正确的搜索是什么?
如果您需要在引号中查找引号,有一些丑陋的构造可以做到这一点。
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 ~]$
:-)
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
对我有用。
*
以匹配文字
*
,而不是使其成为零个或多个匹配字符:
~*
将匹配零次或多次出现的
~
while
~\*
与
~*
之后的表达式 something
匹配
:alnum:
周围使用双括号(参见示例此处)
*
之后使用
[[:alnum::]]
不仅可以匹配单引号之间的一个 字符,还可以匹配其中的多个
[[:alnum:]]
(两个括号)指定
[[:alnum:]]
仅匹配one 字符。匹配零个或多个字符
[[:alnum:]]*
" "
来引用正则表达式:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
'
,然后使用
"
。如果要转义单引号,可以使用
'
并转义它们,或者使用双引号。另外,正如 Matteo 所评论的,字符类有双方括号:
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
或
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog