我有一个大文本文件。我想挑选出形式的字符串
(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)
答案 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
删除第一行