删除方括号外的所有数据

如何删除方括号[]以外的所有数据?

例如:从

 [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将打破这样的领域:

  1. “”(空字符串)
  2. “lipsum1; limpsum1; lipsum1”
  3. “lipsum2” (领先的空间)
  4. “lipsum1; limpsum1; lipsum1”
  5. “lipsum2”(领先的空间)

所以你可以看到你想输出字段#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] 

这是如何工作的:

  1. 删除所有内容到第一个[s/^[^\[]*//
  2. 用空格替换][之间的所有内容: s/\][^\[]*\[/\] \[/
  3. 删除最后一个]s/[^]]*$//

这当然只在括号被标准化的情况下才起作用。