Linux 如何在Bash/Grep中转义单引号?
我想用grep搜索如下所示的字符串:Linux 如何在Bash/Grep中转义单引号?,linux,bash,escaping,grep,Linux,Bash,Escaping,Grep,我想用grep搜索如下所示的字符串: something ~* 'bla' 我试过了,但是shell删除了单引号argh grep -i '"something ~* '[:alnum:]'"' /var/log/syslog 正确的搜索方法是什么? 字符类用[:alnum:]指定(两个括号) [[:alnum:][/code>仅匹配一个字符。要匹配零个或多个字符,[:alnum:]* 您可以使用“引用正则表达式: grep -i "something ~\* '[[:alnum:]]*'"
something ~* 'bla'
我试过了,但是shell删除了单引号argh
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
正确的搜索方法是什么?- 字符类用
指定(两个括号)[:alnum:]
[[:alnum:][/code>仅匹配一个字符。要匹配零个或多个字符,
[:alnum:]*
- 您可以使用
引用正则表达式:“
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
Matteo根据您的表达式,您似乎首先使用
'
,然后使用“
。如果要转义单引号,可以使用'
并转义它们,或者使用双引号。此外,作为Matteo注释,字符类也有双方括号:
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
或
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog
对我有用
- 转义第一个
以匹配文本*
,而不是将其设为零个或多个匹配字符:*
将匹配零次或多次出现的~*
,而~
匹配~\*
某物之后的表达式
~*
- 在
周围使用双括号(参见示例):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?'"'"'"'
它不漂亮,但很管用。:)
当然,如果你把事情放在变量中,所有这些都是没有意义的
[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 ~]$
:-)Shell删除了双引号中的单引号?我第一次看到它!:)他在双引号中有单引号:正则表达式以
开头“
不仅仅是”
@Matteo,是的,乍一看很难:)@Matteo-当然可以,如果它是字面意思的话。~*
意思是”零个或多个“~”字符“@Graham,谢谢你的更正。我没有注意到他在寻找文字“*”。感谢您的简要概述,我只需+1即可将您的分数提高到10k:)@oldergod,\n
的许多实现都不支持echo
。bash使用的内置echo
支持它,但它在Bourne兼容模式下不起作用(即当bash以/bin/sh
运行时),并且它不在FreeBSD的tcsh内置的echo中。如果希望\n
能够持续工作,我建议您使用printf
。至于你的问题。。。我的建议是你做实验。。。或者更明智的建议是:如果代码不清楚,请使用不同的代码。@mklement0,关于术语,是的,自从我写了那个评论后,我已经更新了我的口语。:)关于转义序列,我知道你们知道这是怎么回事,所以我想我们一定是沟通错误了。在POSIX模式下,bash的内置echo不会将像\n
这样的转义序列解释为两个字符\
和n
。试试看:bash--posix-c'echo“one\ntwo”
。我还注意到,coreutils中的/bin/echo
的行为与我预期的一样<另一方面,代码>破折号(IIRC)是Ubuntu上默认的sh
,当作为sh
启动时,它会解释转义序列。可能是你用dash测试的吗?@mklement0,实际上,这些序列的解释是for,它(大部分)包括但不等同于POSIX.1。正如您链接到的文档所述,“以下字符序列将在任何参数内的符合XSI的系统上被识别:”我想最好知道“POSIX兼容模式”是否指POSIX.1、POSIX:2001(SUS),我认为它将包括XSI或其他内容;为了补充您的发现:具体来说,XSI是POSIX一致性所需内容的可选超集(从当前的POSIX标准开始仍然适用)getconf\u XOPEN\u UNIX
告诉给定系统是否支持XSI,getconf\u XOPEN\u VERSION
报告XSI版本。OSX 10.11和Linux 3.x内核系统都报告支持。Linux没有正式认证,但OSX是(UNIX 03),这解释了为什么他们特意调整Bash。
[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 ~]$