如何从与模式匹配的单个字符串中 grep 单词?

如何从与模式匹配的单个字符串中 grep 单词?

有人可以指导我从下面的单个字符串中仅 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

如果您想使用cutsed命令,请使用以下命令:

<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

如果您想了解有关此命令的更多详细信息,可以阅读我与伊莱亚·卡根

相关内容