如何删除方括号[]以外的所有数据?
例如:从
[lipsum1;limpsum1;lipsum1] lipsum2;[lipsum1;limpsum1;lipsum1] lipsum2
我想获得:
[lipsum1;limpsum1;lipsum1] [lipsum1;limpsum1;lipsum1]
您可以使用[和]作为字段分隔符,并打印每个第二个字段:
awk -F '[][]' '{for (i=2; i<NF; i+=2) printf "[%s]%s", $i, OFS; print ""}' <<END [lipsum1;limpsum1;lipsum1] lipsum2;[lipsum1;limpsum1;lipsum1] lipsum2 a [b] c [d] e nothing here [one thing] END
[lipsum1;limpsum1;lipsum1] [lipsum1;limpsum1;lipsum1] [b] [d] [one thing]
这个怪异的字段分隔符[][]是一个正则表达式,匹配[字符或]字符。 当给你的示例输入,awk将打破这样的领域:
所以你可以看到你想输出字段#2和#4(添加括号回来)与之间的空间。
for循环遍历字段2,4,6等等。
printf命令根据需要格式化输出 – 默认的OFS(输出域分隔符)是一个空格。
print ""行只是在循环完成后添加新行。
$ sed -e 's/^[^\[]*//;s/\][^\[]*\[/\] \[/g;s/[^]]*$//;' <<'EOF' lipsum0 [lipsum1;limpsum1;lipsum1] lipsum2;[lipsum1;limpsum1;lipsum1] lipsum2 EOF [lipsum1;limpsum1;lipsum1] [lipsum1;limpsum1;lipsum1]
这是如何工作的:
[ : s/^[^\[]*// ]和[之间的所有内容: s/\][^\[]*\[/\] \[/ ] : s/[^]]*$// 这当然只在括号被标准化的情况下才起作用。