使用 grep 搜索特殊字符

use*_*654 6 grep string search file-search

我想搜索包含以下任何字符的行:

: / / ? # [ ] @ ! $ & ' ( ) * + , ; = %

Kus*_*nda 9

grep "[]:/?#@\!\$&'()*+,;=%[]"
Run Code Online (Sandbox Code Playgroud)

在方括号表达式 中,[...]很少有字符是“特殊的”(只有很小的子集,如]-^、 以及三个组合[=[:[.)。当包含]in 时[...]]必须先出现(可能在 a 之后^)。我选择把第]一个和[最后一个对称。

唯一要记住的另一件事是单引号字符串不能包含单引号,因此我们在表达式周围使用双引号。由于我们使用双引号字符串,shell 会在其中四处寻找以扩展内容。出于这个原因,我们将$as转义,\$这将使 shell 给出一个字面量$to grep,并且我们也将其转义!\!历史扩展bashbash尽管仅在交互式shell 中)。

如果您想在集合中包含一个反斜杠,您必须将其转义,\\以便 shell 给grep. 此外,如果您想包含一个反引号`,它也必须被转义,\`否则它会启动命令替换。

上面的命令将提取包含括号表达式中至少一个字符的任何行。


使用单引号字符串而不是双引号字符串,这样可以解决 shell 解释哪些字符的大部分烦恼:

grep '[]:/?#@!$&'"'"'()*+,;=%[]'
Run Code Online (Sandbox Code Playgroud)

在这里,除了放置 之外,唯一要记住的]是单引号字符串不能包含单引号,因此我们使用三个字符串的串联:

  1. '[]:/?#@!$&'
  2. "'"
  3. '()*+,;=%[]'

另一种方法是使用 POSIX 字符类[[:punct:]]。这与从集合的单个字符!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~,这是一个更大的集比什么在这个问题(这还包含给定的"-.<>^_`{|}~),但所有的“标点符号”是POSIX定义。

LC_ALL=C grep '[[:punct:]]'
Run Code Online (Sandbox Code Playgroud)


小智 6

[:punct:]如果您不介意它也匹配其他标点符号和特殊字符,您可以使用字符类:

grep '[[:punct:]]' file
Run Code Online (Sandbox Code Playgroud)