2012-10-22 68 views
0

我想寫一個腳本與文件作爲參數,greps文本文件來查找任何字以大寫開頭,並有8個字母后面。我的語法不好,所以我會告訴你我的代碼,我相信這是一個簡單的修復。grep語法與首都

grep -o '[A-Z][^ ]*' $1 

我不知道如何指定:

一)它開始以一個大寫字母,以及

B),它是一個9字母組成的單詞。

乾杯

編輯:

正如我想加我新的代碼編輯:

while read p 
do 
echo $p | grep -Eo '^[A-Z][[:alpha:]]{8}' 
done < $1 

我仍然無法得到它的工作,在我的新的幫助碼?

回答

2

'[A-Z][^ ]*'將匹配A和Z之間的一個字符,後面跟零個或多個非空格字符。所以它會自己匹配任何A-Z字符。

使用\b來表示一個單詞邊界,並且量詞括號括起來的,例如:

grep '\b[A-Z][a-z]\{8\}\b' 

如果你只是做了grep '[A-Z][a-z]\{8\}',將匹配(例如)「aaaaHellosailor」。

我使用\{8\},大括號需要轉義,除非您使用grep -E,也稱爲egrep,它使用擴展正則表達式。您正在使用的香草grep使用基本正則表達式。還請注意,\b不是標準的一部分,但通常受支持。

如果使用^在開始和$末尾,則它不會在找到「威爾特郡」「A威爾特郡豬使偉大的香腸」,它只能找到這只是包括一個9個字符的代名詞線和沒有其他的。

+0

+1字邊界找到9個字母詞 –

1

這個工作對我來說:

$ echo "one-Abcdefgh.foo" | grep -o -E '[A-Z][[:alpha:]]{8}' 
$ echo "one-Abcdefghi.foo" | grep -o -E '[A-Z][[:alpha:]]{8}' 
Abcdefghi 
$ 

注意,這不處理擴展或前綴。如果要強制輸入是一個9個字母大寫的字,我們需要更加明確:

$ echo "one-Abcdefghij.foo" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b' 
$ echo "Abcdefghij" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b' 
$ echo "Abcdefghi" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b' 
Abcdefghi 
$ 
+0

爲什麼你有$後{8}? – Unknown

+0

此外,現在我正在嘗試 grep -o -E'^ [AZ] [':alpha]] {8} $' 我沒有收到任何東西,是否必須管入grep的? – Unknown

+0

'^'和'$'不是正確的錨點 - 使用'\ <' and '\>'或'\ b'和'\ b'來表示單詞的邊界 –

0

我有以下內容命名爲「testfile的」測試文件:

Aabcdefgh 
Babcdefgh 
cabcdefgh 
eabcd 

現在你可以用下面的命令的grep在該文件中:

grep -Eo '^[A-Z][[:alpha:]]{8}' testfile 

上面的代碼等於於:

cat testfile | grep -Eo '^[A-Z][[:alpha:]]{8}' 

這符合

Aabcdefgh 
Babcdefgh 
+0

這拒絕與我的測試文件Randomtext.txt一起工作。 它包含:大聲的布朗母牛跳過白月亮。十月十月tesTer Abcdefgh Abcdefgha。 我的代碼與您的代碼完全相同,但後面跟隨Randomtext.txt。 – Unknown

+0

你可以用測試文件編輯你的問題,所以我們可以看到換行符是哪裏? – cdarke