有人可以指导我从下面的单个字符串中仅 grep 包含模式 _ARA 的单词吗?
细绳:
LINK:['IM219MIR_ARA1','IM18Q4_ARA1','SM18Q4_ARA1','IM18PLANNING_ARA1','IM118Q4DYNVA_ARA1','IM218Q4DYNVA_ARA1','IM119EIOPALTG_ARA1','IM219EIOPALTG_ARA1','SM119EIOPALTG_ARA1']}
预期输出:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
答案1
grep
接受-o
仅打印匹配的文本,即使匹配来自同一行,也要打印在不同的行上。它还接受-w
强制正则表达式匹配整个单词(或根本不匹配),其中单词是字母、数字和下划线的最大序列。因此,您只需使用:
grep -ow '\w*_ARA\w*'
在这种情况下,您实际上可以省略该-w
选项(如果您愿意),并获得相同的结果,因为此处的正则表达式明确仅匹配带有 的单词字符\w
。
由于没有文件名参数,因此将从标准输入读取。如果您显示的文本位于文件中(例如,名为input.txt
--),那么您将把它作为参数传递:
grep -ow '\w*_ARA\w*' input.txt
输出:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
从技术上讲,此输出与问题中显示的输出略有不同,因为您显示的预期输出列出了IM119EIOPALTG_ARA1
两次,尽管它在您显示的文本中只出现了一次。我猜这是一个错误,您实际上只想要它一次。
答案2
如果您想使用cut
和sed
命令,请使用以下命令:
<test.txt cut -d'[' -f2 | cut -d']' -f1 | sed "s/,'/\\n/g" | sed 's/.$//' | cut -d\' -f2 | grep _ARA
解释分为两部分:
grep _ARA
会找到必须过滤的行cut -d'[' -f2
将删除单词前的字符,同样cut -d']' -f1
也会删除单词后的字符sed "s/,'/\\n/g"
将提取一行中的每个单词<test.txt
只是命令的cut
重定向grep
执行完这 4 个命令后,结果如下:
'IM219MIR_ARA1'
IM18Q4_ARA1'
SM18Q4_ARA1'
IM18PLANNING_ARA1'
IM118Q4DYNVA_ARA1'
IM218Q4DYNVA_ARA1'
IM119EIOPALTG_ARA1'
IM219EIOPALTG_ARA1'
SM119EIOPALTG_ARA1'
因此,为了删除'
每个单词末尾的
sed 's/.$//'
对于第一个'
,我们使用
cut -d\' -f2
所以最终的结果是:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
如果您想了解有关此命令的更多详细信息,可以阅读我与伊莱亚·卡根。