2012-05-19 44 views
7

我有一個文件包含一些單詞括號。我想編譯出現在此的所有獨特的單詞列表,如:如何查找括號之間出現的所有單詞?

This is some (text). 
This (text) has some (words) in parenthesis. 
Sometimes, there are numbers, such as (123) in parenthesis too. 

這將是結果列表:

text 
words 
123 

我怎麼能列出所有之間出現的物品插入語?

回答

17

您可以使用awk這樣的:

awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' file.txt

打印:

text 
text 
words 
123 

您可以使用陣列打印獨特的價值觀:

awk -F "[()]" '{ for (i=2; i<NF; i+=2) array[$1]=$i; print array[$1] }' file.txt

打印:

text 
words 
123 

HTH

+0

像這樣它是優雅的。然而,不平衡括號會失敗,因爲它實際上只是使用括號作爲分隔符。 「 '」1)看看(這個)(單詞)是否被抓到了'' 打印'看看' –

3

grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq

  • -o只打印匹配的文本
  • -E方式使用擴展的正則表達式
  • \(手段匹配一個括號
  • [[:alnum:]]是字母和數字的POSIX字符類。

sed這個腳本應該去掉包袱。這是針對GNU grep進行測試的,但是BSD sed要謹慎。

+0

我需要將全局'g'標誌附加到我的sed命令的結尾處,但否則這會奏效。 – chrisaycock

+0

這就是我得到的打字和不復制! – mkb

2

要重現列表:

cat file.txt | sed 's/.*(\(.*\)).*/\1/' 

要編譯的獨特單詞的列表,你需要進一步處理列表:

cat file.txt | sed 's/.*(\(.*\)).*/\1/' | sort | uniq 
+2

這不適用於包含多個「(單詞)」的句子。 sed只會找到一個匹配項。 – chrisaycock

+0

你能改正這一點,因爲這不會在@chrisaycock建議的句子上工作 –

+0

@VenkatMadhav從史蒂夫接受的答案工作正常。 –

5

隨着GNU的grep,您可以使用一個Perl - 兼容的正則表達式與查找斷言來排除父項:

grep -Po '(?<=\().*?(?=\))' file.txt | sort -u 
+0

+1我知道這可以用一個很好的grep完成。添加排序和uniq管道以保持一致性 – Steve

+1

@steve,我看到你的'sort | uniq'並且給你一個'sort -u' –

1

你可以試試這個

sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename|awk -F'(' '{print $2}'|sort -u 

釋:

首屆sed的語句將詞語的括號在新線和第二SED替換新行字符「)」。因此,運行下面的語句

sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename 

後的輸出應該是這樣的

This is some 
(text 
.This 
(text 
has some 
(words 
in parenthesis. 
Sometimes, there are numbers, such as 
(123 
in parenthesis too. 

現在管道這個輸出低於該打印過濾字符之間的第二個字的awk語句「(」

awk -F'(' '{print $2}' 

輸出現在將是

text 
text 
words 
123 

上面的輸出是通過管道進行排序的,-u命令從上面的輸出中給出唯一的單詞。 希望這個解釋有幫助。

+0

請解釋你的答案有點... –

+0

@AK_編輯我的答案並加以解釋。如果您滿意,希望能夠幫助並提高答案。 –

+0

+1現在它是一個寫得很好的答案。 –

相關問題