![使用 grep 搜索特殊字符](https://linux22.com/image/143592/%E4%BD%BF%E7%94%A8%20grep%20%E6%90%9C%E7%B4%A2%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6.png)
我想搜索包含以下任意字符的行:
:
/
/
?
#
[
]
@
!
$
&
'
(
)
*
+
,
;
=
%
答案1
grep "[]:/?#@\!\$&'()*+,;=%[]"
在括号表达式 中,[...]
很少有字符是“特殊”的(只有一个非常小的子集,例如]
、-
和以及 、和的^
三个组合)。当包含in时,必须放在第一位(可能在 a 之后)。为了对称,我选择放置第一个和最后一个。[=
[:
[.
]
[...]
]
^
]
[
唯一要记住的另一件事是单引号字符串不能包含单引号,因此我们在表达式周围使用双引号。由于我们使用双引号字符串,因此 shell 会在其中进行探索以进行扩展。出于这个原因,我们转义了$
as \$
,这将使 shell 给出一个字面值$
,grep
并且我们也转义了!
as \!
,因为它是 in 的历史扩展bash
(尽管仅在交互式bash
shell 中)。
如果您想在集合中包含反斜杠,则必须将其转义,以便\\
shell 为 提供单个反斜杠grep
。另外,如果您想包含反引号`
,也必须对其进行转义,\`
否则它会启动命令替换。
上面的命令将提取至少包含括号表达式中的一个字符的任何行。
使用单引号字符串而不是双引号字符串,可以解决 shell 解释字符的大部分烦恼:
grep '[]:/?#@!$&'"'"'()*+,;=%[]'
在这里,除了 的放置之外,唯一要记住的]
是单引号字符串不能包含单引号,因此我们使用三个字符串的串联:
'[]:/?#@!$&'
"'"
'()*+,;=%[]'
另一种方法是使用 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)