在一些文本文件中有很多[with text inside]
. 我只想打印括号内的任何内容。括号的数量是文件是未知的,每个要解析的文件都不同。
我试图用 解析它sed
,但做不到。
使用 GNU grep
grep -oP '(?<=\[)[^]]*'
对左括号使用正向后视,匹配所有非右括号字符。例子:
$ echo 'foo [bar] baz [hello world]' | grep -oP '(?<=\[)[^]]*'
bar
hello world
perl -nE'say for /\[( [^\[\]]* )\]/xg;'
或者如果内容可以跨行。
perl -0777nE'say for /\[( [^\[\]]* )\]/xg;'
您可以将文件名作为参数传递,也可以使用 STDIN。
或者,您可以尝试:
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"
$
这可能对您有用(GNU sed):
sed ':a;/\[/!d;/\]/!{$!N;s/\n/ /;ba};s/[^[]*\[\([^]]*\)\]/\1\n/;P;D' file
[...]
注意它用空格替换 a 中的换行符。