Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在Bash/Grep中转义单引号?_Linux_Bash_Escaping_Grep - Fatal编程技术网

Linux 如何在Bash/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:]]*'"

我想用grep搜索如下所示的字符串:

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