删除方括号外的所有数据

时间:2014-04-25 16:13:11

标签: linux bash shell

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

示例:来自

[lipsum1;limpsum1;lipsum1] lipsum2;[lipsum1;limpsum1;lipsum1] lipsum2

我想获得:

[lipsum1;limpsum1;lipsum1] [lipsum1;limpsum1;lipsum1]

2 个答案:

答案 0 :(得分:3)

您可以使用[]作为字段分隔符,并打印每个第二个字段:

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. &#34;&#34; (空字符串)
  2. &#34; lipsum1; limpsum1; lipsum1&#34;
  3. &#34; lipsum2;&#34; (领先的空间)
  4. &#34; lipsum1; limpsum1; lipsum1&#34;
  5. &#34; lipsum2&#34; (领先的空间)
  6. 因此,您可以看到要输出字段#2和#4(添加括号),中间有空格。
    for循环遍历字段2,4,6,依此类推 printf命令根据需要格式化输出 - 默认OFS(输出字段分隔符)是空格 print ""行只是在循环完成后添加换行符。

答案 1 :(得分:2)

$ 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. 之前的所有内容
  3. 使用空格替换][之间的所有内容:s/\][^\[]*\[/\] \[/
  4. 删除上一个]之后的所有内容:s/[^]]*$//
  5. 这当然只有在括号标准化时才有效。