Sed - 打印匹配两种模式的线条

时间:2016-06-03 06:52:35

标签: perl sed match

我有以下问题。我的文件看起来像这样:

1082016051300000010005690902BCDEΔ0204366221002201612052016-00001274448A                                                                     
1082016051300000010034397704EDFG10865125102001201626042016-000001028134
1082016051300000010068901401RADJ34835974123112201528042016-000001343290                                                                     
1082016051300000010068901401RADJ34835974103112201528042016-000000910290                                                                     
1082016051300000010095474301RADJ13453401102812201525042016-00000208995K                                                                     
1082016051300000010098429002RADJΤ1052947211312201218042016-000034021290
1032016051300000010095474301RADJ13453401102812201525042016-00000208995K                                                                     
1032016051300000010098429002RADJΤ1052947211312201218042016-000034021290

我试图在线上的任何地方只打印匹配两种模式的线条。我想只打印匹配两个模式的行,第一个模式是columbs 2:1(08),第二个模式是单词(RAD)。我试过用grep做这个:

grep -o '.[0-1][1-8]*RAD' FILEIN

我得到的唯一回应是FILEIN是一个二进制文件。我也试过了这个:

sed -n '/[0-1][1-8]*RAD/p' FILEIN 

但我有一个感觉*没有扩大。我设法通过连续寻找两种模式来实现它,例如:

sed -n '/RAD/p' FILEIN | sed '/^108/p' 

这是有效的,但我将用作输入的文件可能是巨大的,我不确定将流传输到另一个是时间效率。有人能帮助我吗? Awk或Perl也很受欢迎。谢谢

1 个答案:

答案 0 :(得分:2)

您可以向-a添加grep选项,以强制它将文件作为文本读取。

sed是一种脚本语言;你可以轻松地结合多种条件和行动。

sed -n '/regex1/!d;/regex2/p' files...

(如果第一个正则表达式不匹配,请删除此行并选择下一个。否则,如果它与第二个正则表达式匹配,则打印。)

同样也很容易 - 甚至可能更容易 - 在Awk。

awk '/regex1/ && /regex2/' files...