Grep
使用 grep 搜尋特殊字元
我想搜尋包含以下任何字元的行:
:
/
/
?
#
[
]
@
!
$
&
'
(
)
*
+
,
;
=
%
grep "[]:/?#@\!\$&'()*+,;=%[]"
在括號內的表達式中
[...]
,很少有字元是“特殊的”(只有非常小的子集,如]
、-
和^
以及三個組合[=
、[:
和[.
)。當包含]
在 中[...]
時,]
必須先出現(可能在 a 之後^
)。我選擇把第]
一個和[
最後一個對稱。唯一要記住的另一件事是單引號字元串不能包含單引號,因此我們在表達式周圍使用雙引號。由於我們使用雙引號字元串,shell 將在其中四處尋找以擴展內容。出於這個原因,我們將
$
as轉義,\$
這將使 shell 給出文字$
togrep
,並且我們也轉義!
,\!
因為它是歷史擴展bash
(儘管僅在互動式bash
shell 中)。您是否想在集合中包含反斜杠,您必須將其轉義,
\\
以便 shell 為grep
. 此外,如果你想包含一個反引號```,它也必須被轉義,```否則它會啟動命令替換。上面的命令將提取包含括號表達式中至少一個字元的任何行。
使用單引號字元串而不是雙引號字元串,這解決了 shell 解釋的字元的大部分煩惱:
grep '[]:/?#@!$&'"'"'()*+,;=%[]'
在這裡,除了放置 之外,唯一要記住的
]
是單引號字元串不能包含單引號,因此我們使用三個字元串的串聯:
'[]:/?#@!$&'
"'"
'()*+,;=%[]'
另一種方法是使用 POSIX 字元類
[[:punct:]]
。這匹配 set 中的單個字元,該字元集比問題中給出!"#$%&'()*+,-./:;<=>?@[\]^_
{|}~的*更大*
"-.<>^_{|}~
(它還包含),但它是 POSIX 定義的所有“標點符號”。LC_ALL=C grep '[[:punct:]]'