如何删除方括号[]
之外的所有数据?
示例:来自
[lipsum1;limpsum1;lipsum1] lipsum2;[lipsum1;limpsum1;lipsum1] lipsum2
我想获得:
[lipsum1;limpsum1;lipsum1] [lipsum1;limpsum1;lipsum1]
答案 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将分解这样的字段:
因此,您可以看到要输出字段#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]
这是如何运作的:
[
:s/^[^\[]*//
]
和[
之间的所有内容:s/\][^\[]*\[/\] \[/
]
之后的所有内容:s/[^]]*$//
这当然只有在括号标准化时才有效。