我有一個文件包含一些單詞括號。我想編譯出現在此的所有獨特的單詞列表,如:如何查找括號之間出現的所有單詞?
This is some (text).
This (text) has some (words) in parenthesis.
Sometimes, there are numbers, such as (123) in parenthesis too.
這將是結果列表:
text
words
123
我怎麼能列出所有之間出現的物品插入語?
我有一個文件包含一些單詞括號。我想編譯出現在此的所有獨特的單詞列表,如:如何查找括號之間出現的所有單詞?
This is some (text).
This (text) has some (words) in parenthesis.
Sometimes, there are numbers, such as (123) in parenthesis too.
這將是結果列表:
text
words
123
我怎麼能列出所有之間出現的物品插入語?
您可以使用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
grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq
-o
只打印匹配的文本-E
方式使用擴展的正則表達式\(
手段匹配一個括號[[:alnum:]]
是字母和數字的POSIX字符類。sed
這個腳本應該去掉包袱。這是針對GNU grep進行測試的,但是BSD sed要謹慎。
我需要將全局'g'標誌附加到我的sed命令的結尾處,但否則這會奏效。 – chrisaycock
這就是我得到的打字和不復制! – mkb
要重現列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/'
要編譯的獨特單詞的列表,你需要進一步處理列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/' | sort | uniq
這不適用於包含多個「(單詞)」的句子。 sed只會找到一個匹配項。 – chrisaycock
你能改正這一點,因爲這不會在@chrisaycock建議的句子上工作 –
@VenkatMadhav從史蒂夫接受的答案工作正常。 –
隨着GNU的grep,您可以使用一個Perl - 兼容的正則表達式與查找斷言來排除父項:
grep -Po '(?<=\().*?(?=\))' file.txt | sort -u
+1我知道這可以用一個很好的grep完成。添加排序和uniq管道以保持一致性 – Steve
@steve,我看到你的'sort | uniq'並且給你一個'sort -u' –
你可以試試這個
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命令從上面的輸出中給出唯一的單詞。 希望這個解釋有幫助。
請解釋你的答案有點... –
@AK_編輯我的答案並加以解釋。如果您滿意,希望能夠幫助並提高答案。 –
+1現在它是一個寫得很好的答案。 –
像這樣它是優雅的。然而,不平衡括號會失敗,因爲它實際上只是使用括號作爲分隔符。 「 '」1)看看(這個)(單詞)是否被抓到了'' 打印'看看' –