如何获得所有匹配regex1的字符串后跟一个字符串?

问题描述:

我有一个很大的文本文件。我想挑出来之后是字符串“foobar的”形式如何获得所有匹配regex1的字符串后跟一个字符串?

(1, 2, 4, ...) 

的字符串。这两个字符串都可以出现在多行上。如何在UNIX命令行上快速执行此操作?

(1, 2) foobar 
foobar (3, 4, 5) foobar (23, 45) 
(6, 
7, 8) foobar 
(9, 10, 11) foo 
bar 

应该给使用perl

(1, 2) 
(3, 4, 5) 
(6, 7, 8) 
(9, 10, 11) 
+0

可不可以给一个行应匹配的例子吗? – 2012-07-11 21:59:32

$ tr -d '\n' <input | grep -oP '\([^()]*\)(?= foobar)' 
(1, 2) 
(3, 4, 5) 
(6,7, 8) 
(9, 10, 11) 
+0

下面是'sed'管道用于输出输出:'sed's /,* /,/ g'' – Steve 2012-07-11 22:42:40

一种方式。它将标量变量中的输入文件的所有内容抽出,并用正则表达式检查括号之间的任意数字组,然后输入文字foobar,并打印每个匹配项。

perl -e ' 
    chomp(@s = <>); 
    $s = join q||, @s; 
    printf qq|%s\n|, $1 while $s =~ m/(\((?:,?\s*\d+\s*)+\))\s*foobar/g; 
' infile 

有了这个内容的infile

(1, 2) foobar 
foobar (3, 4, 5) foobar (23, 45) 
(6, 
7, 8) foobar 
(9, 10, 11) foo 
bar 

输出将是:

(1, 2) 
(3, 4, 5) 
(6,7, 8) 
(9, 10, 11) 

这可能会为你工作:

sed '/(/!d;s/(/\n&/;s/^[^\n]*\n//;:a;$!{/) foobar/!N;/) foobar/!ba};s/\n//g;s/\(([^)(]*)\) foobar/\n\1\n/;s/^[^\n]*\n//;P;D' file 

说明:

  • /(/!d删除线没有(
  • s/(/\n&/前面加上一个新行到第一(
  • s/^[^\n]*\n//删除所有字符高达并且包括第一换行符。
  • :a占位
  • $!{/) foobar/!N;/) foobar/!ba}如果不是最后一行检查了) foobar如果不追加下一行,如果还没有) foobar环路a
  • s/\n//g删除所有换行符。
  • s/\(([^)(]*)\) foobar/\n\1\n/用换行符围绕预期的字符串。
  • s/^[^\n]*\n//删除所有字符,包括第一个换行符。
  • P打印第一线
  • D删除第一行