如何找到以 ** 開頭的行

如何找到以 ** 開頭的行

我需要查找文件中是否有任何行以**.

我不知道如何做到這一點,因為*它被 shell 解釋為通配符。

grep -i "^2" test.out

如果該行以 2 開頭,則有效,但是

grep -i "^**" test.out 

顯然不起作用。

(我還需要知道該行是否以 a 結尾,)但尚未嘗試)。

答案1

使用該\字元對 * 進行轉義,使其成為普通字元。

grep '^\*\*' test.out

另請注意單引號'而不是雙引號,"以防止 shell 擴展內容

答案2

**當您想要檢查以 開頭和結尾的行時),您可以組合兩個grep操作,如下所示,

grep '^*\*' test.out | grep ')$'

或使用grep這樣的單一命令,

grep -E '^\*\*.*\)$' test.out

解釋

  • ^\*\*:匹配以以下開頭的行**
  • .*: 配對後面的所有內容**
  • \)$):匹配行尾也有的行。

答案3

這不是殼

到目前為止,所有答案都沒有觸及真正的問題。解釋一下會很有幫助為什麼它不按您的預期工作。

grep -i "^**" test.out

因為你有的模式grep*不是由外殼擴展。它被傳遞到grep按原樣。手冊頁[1]對此進行了解釋巴什[2]

將字元括在雙引號中會保留引號內所有字元的字面值,但 $、`、\ 以及啟用歷史擴充時的 ! 除外。

就是普通的正規表示式

正規表示式是一個圖案描述一組字串。

*是正規表示式中的關鍵模式之一。預設情況下,grep解釋如下:

* The preceding item will be matched zero or more times.

這意味著您的模式目前^**沒有太大意義。可能它會嘗試匹配行的開頭零次或多次, 兩次。不管什麼意思。

解決辦法是引用它:

任何具有特殊意義的元字元都可以透過在其前面加上反斜線來引用。

grep -i "^\*\*" test.out


[1] 我不建議閱讀它。請使用man dash或類似的代替。

[2] 沒有給 shell,所以我假設巴什

答案4

這是完全未引用的版本:grep ^\\*\\* test.out。要將文字反斜線從 shell 傳遞到 grep,需要對其進行轉義。

只要目錄中沒有以另一個反斜線開頭^\並包含另一個反斜線的文件,此操作就有效。

相關內容