
我需要查找文件中是否有任何行以**
.
我不知道如何做到這一點,因為*
它被 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,需要對其進行轉義。
只要目錄中沒有以另一個反斜線開頭^\
並包含另一個反斜線的文件,此操作就有效。