use*_*654 6 grep string search file-search
我想搜索包含以下任何字符的行:
:
/
/
?
#
[
]
@
!
$
&
'
(
)
*
+
,
;
=
%
grep "[]:/?#@\!\$&'()*+,;=%[]"
Run Code Online (Sandbox Code Playgroud)
在方括号表达式 中,[...]
很少有字符是“特殊的”(只有很小的子集,如]
、-
和^
、 以及三个组合[=
、[:
和[.
)。当包含]
in 时[...]
,]
必须先出现(可能在 a 之后^
)。我选择把第]
一个和[
最后一个对称。
唯一要记住的另一件事是单引号字符串不能包含单引号,因此我们在表达式周围使用双引号。由于我们使用双引号字符串,shell 会在其中四处寻找以扩展内容。出于这个原因,我们将$
as转义,\$
这将使 shell 给出一个字面量$
to grep
,并且我们也将其转义!
为\!
历史扩展bash
(bash
尽管仅在交互式shell 中)。
如果您想在集合中包含一个反斜杠,您必须将其转义,\\
以便 shell 给grep
. 此外,如果您想包含一个反引号`
,它也必须被转义,\`
否则它会启动命令替换。
上面的命令将提取包含括号表达式中至少一个字符的任何行。
使用单引号字符串而不是双引号字符串,这样可以解决 shell 解释哪些字符的大部分烦恼:
grep '[]:/?#@!$&'"'"'()*+,;=%[]'
Run Code Online (Sandbox Code Playgroud)
在这里,除了放置 之外,唯一要记住的]
是单引号字符串不能包含单引号,因此我们使用三个字符串的串联:
'[]:/?#@!$&'
"'"
'()*+,;=%[]'
另一种方法是使用 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)