如何获得所有匹配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)
答
$ 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
删除第一行
可不可以给一个行应匹配的例子吗? – 2012-07-11 21:59:32