我想知道用 grep 命令查找带有双引号、单引号或无引号的字符有什么区别,例如
grep ^'\' foo
grep ^"\" foo
grep \ foo
答案1
实际上,您使用 产生了一个不好的例子,并将\
其放在^
引号之外。
引号的行为(或不存在)由您使用的 shell 决定(我假设是bash
),而不是由grep
.作为一般经验法则:
" double quotes Shell variables between the quotes are expanded
' single quote Shell variables do not get expanded
no quotes you can only use a single word, unless you escape the spaces.
因此,请记住 shell 首先进行一些解释,然后将参数传递给grep
.
现在一些例子:
cat >afile <<EOF
a
aa
aaa
EOF
cat > abfile <<EOF
a
b
ab
aba
EOF
avar=a
我们创建两个文件afile
和abfile
一个 shell 变量avar
。
grep 'a' afile
会给:
a
aa
aaa
grep "a" afile
会给:
a
aa
aaa
(相同)。grep "$avar" afile
将变量扩展avar
为a
因此,结果是
a
aa
aaa
但是,grep '$avar' afile
不会扩展变量avar
,因此结果是:
(空的)
ab 文件是为示例创建的,不带引号。您现在应该明白为什么:
avar='a abfile'
grep $avar
给出:
a
ab
aba
当然,如果您想查找单引号,则应该查找单引号,grep "'"
反之亦然。
答案2
任何由连接在一起的带引号的字符串组成的 shell“单词”仍然是单个参数。所以你可以用不同的规则来论证。
Paul--) Q='One Two'
Paul--) J=A'${Q}'B"${Q}"C
Paul--) echo ::"${J}"::
::A${Q}BOne TwoC::
Paul--) echo ::${J}{Foo,Bar}::
::A${Q}BOne TwoCFoo:: ::A${Q}BOne TwoCBar::
Paul--) echo ::"${J}{Foo,Bar}"::
::A${Q}BOne TwoC{Foo,Bar}::