2017-08-09 50 views

回答

1

每grep的人:

基本VS擴展正則表達式

在基本的正則表達式的元字符,+,{,|,(和) 失去了特殊的意義;請使用反斜槓版本\?, \ +,\ {,\ |,\(和\)。

嘗試:

#!/bin/sh 
if ! grep -q -e "1[ \t]\+2[ \t]\+3" test.txt; then 
    echo "not found" 
else 
    echo "found" 
fi 
+0

謝謝。另一種方法是將'-e'改爲'-E'。 – pacoverflow

+0

嗯,它仍然不能正常工作 - 如果我將'test.txt'中的空格更改爲製表符,腳本會打印出'not found'。 – pacoverflow

+0

我的男人說'-P'是「高度實驗性的」,所以我會改變'\ t'爲'[:space:]'。謝謝! – pacoverflow

0

嗯,我試圖修改對方的回答,這是不正確的,它目前的立場。但是,編輯爲rejected,所以我必須張貼我自己的答案,因爲評論是「second class citizens on the Stack Exchange network, not designed to hold information for all eternity [and] may get cleaned up at any time.

正如在其他答覆中提到,該-e選項僅支持基本的正則表達式(這意味着+沒有特殊含義)。因此-E選項應該用於支持+元字符的擴展正則表達式。

另外,grep只支持POSIX正則表達式,它不會將\t識別爲製表符。修復此問題的最簡單方法是,仍然保持可讀性,並且不使用任何實驗性的grep選項(如-P),則將[ \t]替換爲[[:space:]]

因此固定腳本的樣子:

#!/bin/sh 
if ! grep -q -E "1[[:space:]]+2[[:space:]]+3" test.txt; then 
    echo "not found" 
else 
    echo "found" 
fi 
+0

(爲什麼其他已知的錯誤答案被標記爲接受?) –

+0

@CharlesDuffy它已被拒絕。順便說一句,我把你提到的兩個問題看作是重複的問題,而我認爲他們不適用。 [第一個問題](https://stackoverflow.com/questions/7805676/difference-between-grep-and-perl-regex)是關於perl的正則表達式,我不使用它。 [第二個問題](https:// stackoverflow。com/questions/4233159/grep-regex-whitespace-behavior)是關於'\ s',我沒有使用,答案甚至提到使用'\ t',這對我的情況是不正確的。 – pacoverflow

+0

Gotcha。我從'PCRE'引擎讀取'\ t',但是你做了一個足夠強大的案例 - 重新開放。 –

相關問題