【问题标题】:Sed - Print Lines that match two patternsSed - 打印匹配两种模式的行
【发布时间】:2016-06-08 02:26:53
【问题描述】:

我有以下问题。我的文件如下所示:

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

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

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

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

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

但我感觉 * 没有扩展。我已经设法通过连续寻找两种模式来使其工作,例如:

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

这可行,但我将用作输入的文件可能很大,而且我不确定将流通过管道传输到另一个流是否有效。有人可以帮助我吗?也欢迎 Awk 或 Perl。谢谢

【问题讨论】:

  • 已经回答请访问here

标签: perl sed match


【解决方案1】:

您可以将-a 选项添加到grep 以强制它以文本形式读取文件。

sed 是一种脚本语言;您可以轻松组合多个条件和操作。

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

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

同样的事情在 Awk 中也很容易——也许甚至更容易。

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

【讨论】:

  • 并非所有sed 方言都像分号语句分隔符。如果这对您来说是个问题,请尝试使用换行符,或传递多个 -e 选项。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2023-04-03
  • 2023-03-25
  • 2019-01-03
  • 2019-04-29
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多