使用 grep 搜索特殊字符

使用 grep 搜索特殊字符

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

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

答案1

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

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

唯一要记住的另一件事是单引号字符串不能包含单引号,因此我们在表达式周围使用双引号。由于我们使用双引号字符串,因此 shell 会在其中进行探索以进行扩展。出于这个原因,我们转义了$as \$,这将使 shell 给出一个字面值$grep并且我们也转义了!as \!,因为它是 in 的历史扩展bash(尽管仅在交互式bashshell 中)。

如果您想在集合中包含反斜杠,则必须将其转义,以便\\shell 为 提供单个反斜杠grep。另外,如果您想包含反引号`,也必须对其进行转义,\`否则它会启动命令替换。

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


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

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

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

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

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

LC_ALL=C grep '[[:punct:]]'

答案2

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

grep '[[:punct:]]' file

答案3

如果您要查找一个属于特殊字符的字符,则可以使用完整的正则表达式来查找方括号内的特殊字符。练习、学习和检查正则表达式的绝佳资源是正则表达式101.com

这使用 Perl 正则表达式,它可以与 GNU grep 一起使用,并带有以下-P选项:

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"
                            ^^^

请注意,您需要美元符号前面的反斜杠,因为它在 shell 中具有特殊含义,第一个反斜杠将为 shell 转义。(前面只有一个反斜杠,shell 会删除反斜杠,grep会看到一个未转义的美元符号,表示行尾,并匹配任何输入行。)

如果您的终端支持颜色,也可以添加颜色,

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"

这是我的正则表达式的解释正则表达式101.com

/(\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm
1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])
  \: matches the character : literally (case sensitive)
  \/ matches the character / literally (case sensitive)
  \? matches the character ? literally (case sensitive)
  \# matches the character # literally (case sensitive)
  \@ matches the character @ literally (case sensitive)
  \! matches the character ! literally (case sensitive)
  \$ matches the character $ literally (case sensitive)
  \& matches the character & literally (case sensitive)
  \' matches the character ' literally (case sensitive)
  \( matches the character ( literally (case sensitive)
  \) matches the character ) literally (case sensitive)
  \* matches the character * literally (case sensitive)
  \+ matches the character + literally (case sensitive)
  \, matches the character , literally (case sensitive)
  \; matches the character ; literally (case sensitive)
  \= matches the character = literally (case sensitive)
  \% matches the character % literally (case sensitive)
  \[ matches the character [ literally (case sensitive)
  \] matches the character ] literally (case sensitive)

相关内容