使用 grep 检索包含 !#abc 的文件

使用 grep 检索包含 !#abc 的文件

我正在尝试显示包含以下内容的文件

!#abc

我试过这样

grep -l '!#abc'

但它不起作用。为什么?

另外,当我尝试类似的事情时

echo "#!a"

它检索

echo "#alias".

有人可以解释一下这里发生了什么吗? #! 是什么意思?实际上代表?

答案1

你必须写

grep \\!\\#abc <file>

你基本上必须转义 the#和 the !,这两个字符在几乎任何 shell 中都有特殊含义,请阅读 shell 手册以了解有关它们的更多信息。

答案2

好吧, grep:grep -l '!#abc'还需要一个要处理的文件列表:

grep -l '!#abc' ./*

适用于当前目录中的所有文件。

echo:echo "#!a"需要多一点引用,例如:

$ echo '#!a'
#!a

$ echo '#'\!'a'
#!a

$ echo '#'\!a
#!a

$ echo "#!"a
#!a

$ echo "#"'!a'
#!a

$ echo $'#!a'
#!a

'#' 是注释字符。从LESS=+'/^ *COMMENTS' man bash

评论

In a non-interactive shell, or an interactive shell in which the  
interactive_comments option to the shopt builtin is enabled (see SHELL  
BUILTIN COMMANDS below), a word beginning with # causes that word and  
all remaining characters on that line to be  ignored. An interactive  
shell without the interactive_comments option enabled does not allow  
comments. The interactive_comments option is on by default in  
interactive shells.

它后面的任何内容都被视为“评论”并且不会被处理,例如:

$ echo one # two three
one

如果你想避免它的影响,你需要引用它,或者将它放在其他一些非空白字符之后:

$ echo one t# wo three
one t# wo three

!历史上的“关键人物”。
只是冰山一角:来自LESS=+'/^ *HISTORY EXPANSION' man bash

历史扩展
历史扩展是通过历史扩展角色的出现来引入的,它是!默认情况下。只有反斜杠 () 和单引号可以引用历史扩展字符,但如果历史扩展字符紧邻双引号字符串中的结束双引号之前,也将被视为带引号。


所以,对于你的最后一个问题:What does #! in fact represent?

答案是It depends. 也取决于周围的人物。
取决于是否被引用(以及如何引用)。并取决于它是否有前面的空格和/或尾随的空格。

如果引用正确,则只是相同的字符。如果没有用前导空格引用:注释。如果不加引号,则没有前导空格,没有尾随空格:历史扩展。
如果不加引号,则无前导空格,有尾随空格:字符。

当然,这是假设选项

shopt -p interactive_comments
shopt -po history

两样都定了。每个控制交互式 shell 中的相应字符 (#和)。!在非交互式 shell 中,始终强制执行注释字符,并且几乎始终不激活历史扩展。

相关内容