我有一个包含括号中的单词的文件。我想编制一份出现在那里的所有独特单词的列表,例如:
This is some (text).
This (text) has some (words) in parenthesis.
Sometimes, there are numbers, such as (123) in parenthesis too.
这将是结果列表:
text
words
123
如何列出括号内出现的所有项目?
答案 0 :(得分: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
答案 1 :(得分:5)
使用GNU grep,您可以使用带有环绕声断言的perl兼容正则表达式来排除parens:
grep -Po '(?<=\().*?(?=\))' file.txt | sort -u
答案 2 :(得分:3)
grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq
-o
仅打印匹配的文字-E
表示使用扩展正则表达式\(
表示匹配文字paren [[:alnum:]]
是字母和数字的POSIX字符类。 sed
脚本应该删除parens。这是针对GNU grep测试的,但BSD因此要小心。
答案 3 :(得分:2)
要重现您的列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/'
要编制唯一字词列表,您需要进一步处理列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/' | sort | uniq
答案 4 :(得分: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
上述输出通过管道传递给sort -u命令,以从上面的输出中提供唯一的单词。 希望这个解释有所帮助。