如何打印[]内的所有内容?

时间:2013-03-30 01:48:07

标签: regex perl parsing sed awk

在某些文本文件中有许多[with text inside]。我只想打印括号内的任何内容。括号的数量是文件未知,每个要解析的文件都不同。

我尝试用sed解析它,但无法做到。

4 个答案:

答案 0 :(得分:3)

使用GNU grep

grep -oP '(?<=\[)[^]]*'

使用开放式括号的正面后视,匹配所有非闭括号字符。 例如:

$ echo 'foo [bar] baz [hello world]' | grep -oP '(?<=\[)[^]]*'
bar
hello world

答案 1 :(得分:1)

perl -nE'say for /\[( [^\[\]]* )\]/xg;'

或者如果内容可以跨越行。

perl -0777nE'say for /\[( [^\[\]]* )\]/xg;'

您可以将文件名作为参数传递,也可以使用STDIN。

答案 2 :(得分:1)

或者你可以尝试:

awk 'NR>1{print $1}' RS=\[ FS=\] file

例如

$ printf 'First part of foo [bar] not present, ["hello" can be\non a different\nline from "world" ] inside  brackets\n' |
awk 'NR>1{print $1}' RS=\[ FS=\]
bar
"hello" can be
on a different
line from "world"
$

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

N.B。它用空格替换[...]内的换行符。