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

时间:2012-07-11 21:57:53

标签: regex sed awk grep

我有一个大文本文件。我想挑选出形式的字符串

(1, 2, 4, ...)

后跟字符串“foobar”。这两个字符串都可以出现在多行上。如何在UNIX命令行上快速完成此操作?

实施例

(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)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用perl的一种方法。它在标量变量中输入文件的所有内容,并使用正则表达式检查括号之间的任意数字组,后跟文字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)

答案 2 :(得分:1)

这可能对您有用:

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删除第一行