Grep

使用 grep 搜尋特殊字元

  • February 4, 2021

我想搜尋包含以下任何字元的行:

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

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

在括號內的表達式中[...],很少有字元是“特殊的”(只有非常小的子集,如]-^以及三個組合[=[:[.)。當包含]在 中[...]時,]必須先出現(可能在 a 之後^)。我選擇把第]一個和[最後一個對稱。

唯一要記住的另一件事是單引號字元串不能包含單引號,因此我們在表達式周圍使用雙引號。由於我們使用雙引號字元串,shell 將在其中四處尋找以擴展內容。出於這個原因,我們將$as轉義,\$這將使 shell 給出文字$to grep,並且我們也轉義!\!因為它是歷史擴展bash(儘管僅在互動式bashshell 中)。

您是否想在集合中包含反斜杠,您必須將其轉義,\\以便 shell 為grep. 此外,如果你想包含一個反引號```,它也必須被轉義,```否則它會啟動命令替換。

上面的命令將提取包含括號表達式中至少一個字元的任何行。


使用單引號字元串而不是雙引號字元串,這解決了 shell 解釋的字元的大部分煩惱:

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

在這裡,除了放置 之外,唯一要記住的]是單引號字元串不能包含單引號,因此我們使用三個字元串的串聯:

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

另一種方法是使用 POSIX 字元類[[:punct:]]。這匹配 set 中的單個字元,該字元集比問題中給出!"#$%&'()*+,-./:;&lt;=&gt;?@[\]^_{|}~的*更大*"-.<>^_{|}~(它還包含),但它是 POSIX 定義的所有“標點符號”。

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

引用自:https://unix.stackexchange.com/questions/463198