linux 如何在Bash/Grep中转义单引号?

xtfmy6hx  于 4个月前  发布在  Linux
关注(0)|答案(4)|浏览(78)

我想用grep搜索一个字符串,如下所示:

something ~* 'bla'

字符串
我试过了,但是shell删除了单引号。啊...

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


正确的搜索是什么?

dy2hfwbg

dy2hfwbg1#

如果你需要在引号中寻找引号,有一些丑陋的结构可以做到。

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 ~]$


:-)

nwo49xxi

nwo49xxi2#

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

字符串
对我来说没问题

  • 转义第一个*以匹配文字*,而不是使其成为零或多匹配字符:

~*将匹配~的零次或多次出现,
~\*匹配something之后的表达式~*

  • :alnum:周围使用双括号(参见示例here
  • [[:alnum::]]之后使用*不仅可以匹配单引号之间的一个字符,还可以匹配多个单引号之间的字符
  • 单引号根本不必转义,因为它们包含在由双引号限制的表达式中。
3zwtqj6y

3zwtqj6y3#

  • 字符类用[[:alnum:]](两个括号)指定
  • [[:alnum:]]只匹配一个字符。要匹配零个或多个字符[[:alnum:]]*
  • 你可以使用" "来引用正则表达式:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog

字符串

2ic8powd

2ic8powd4#

看起来,根据你的表达式,你首先使用',然后使用"。如果你想转义单引号,你可以使用'并转义它们,或者使用双引号。此外,正如Matteo注解,字符类有双方括号。要么:

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

字符串

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

相关问题