我想用grep搜索一个如下所示的字符串:
something ~* 'bla'
我尝试了这个,但是shell删除了单引号argh ..
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
什么是正确的搜索?
答案 0 :(得分:42)
如果你做需要在引号中用引号查找引号,那么就会有丑陋的构造。
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 ~]$
: - )
答案 1 :(得分:13)
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
适合我。
*
以匹配文字*
,而不是将其设为零或多匹配字符:~*
会匹配零次或多次~
次
~\*
与~*
something
表达式匹配
:alnum:
周围使用双括号(参见示例here)*
之后使用[[:alnum::]]
不仅可以匹配单引号之间的一个字符,还可以匹配其中几个答案 2 :(得分:1)
[[:alnum:]]
(两个括号)[[:alnum:]]
仅匹配一个字符。匹配零个或多个字符[[:alnum:]]*
您可以使用" "
引用正则表达式:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
利玛
答案 3 :(得分:0)
根据您的表达,您首先使用'
,然后使用"
。如果要转义单引号,可以使用'
并转义它们,或使用双引号。另外,作为Matteo注释,字符类具有双方括号:
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
或
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog