
如果你使用這段程式碼:
echo -e '\t\t\tString' | grep '^[\t]*String'
結果是空白的,因為它不匹配,但是:
echo -e '\t\t\tString' | grep $'^[\t]*String'
作品。我發誓我一定在我的腳本和終端中使用了第一行代碼一百次,而從未使用過這樣的“$”字符,而且它似乎總是有效。最近有什麼變化嗎?為什麼需要“$”字元?還是我做錯了什麼?
答案1
答案2
您可能應該意識到不存在單一類型的正規表示式。至少有basic regular expressions
或BRE
(有時只有RE
)、extended regular expressions
或ERE
和perl compatible regular expressions
或PCRE
。所有這些語言使用的語法都略有不同。當前版本GNU grep
支援所有三個並且BRE
是預設的。因為ERE
您需要使用-E
option 和 for PCRE
-P
option。您的範例僅適用-P
於基本和擴展 RE,反斜線失去其含義並[\t]
匹配反斜線或字元 t。您可能在PCRE
預設支援的其他語言中使用該模式,這是有道理的,因為它們是最強大的版本。或者也許你在alias grep='grep -P'
某個地方。
答案3
如果省略 . 則第一行有效^
。也許它有效,但沒有按照您想像的方式工作?我懷疑grep
其行為在如此重要的一點上發生了變化。
echo
預設不翻譯轉義序列。你需要-e
為此。與外殼類似。您需要$'...'
讓 shell 使用轉義序列。