我有一个大文本文件。我想挑选表格字符串
(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)
$ tr -d '\n' <input | grep -oP '\([^()]*\)(?= foobar)'
(1, 2)
(3, 4, 5)
(6,7, 8)
(9, 10, 11)
一种使用方式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)
这可能对您有用:
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
删除没有a的行(
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
删除第一行