Perl 用方括号消除匹配线子字段

Perl 用方括号消除匹配线子字段,perl,awk,sed,Perl,Awk,Sed,我有一个包含行的文件,其中包含用方括号分隔的字段,例如: [tag "x"][severity "y"][id "z"][client 1] 我需要从客户端字段提取数据。但我正在努力寻找最好的方法。很明显,对于像cut这样的人来说,它太先进了 我一直在努力使用sed(我甚至不确定sed是否是“最好的”或“最合适的”工具),但像这样的sed正则表达式似乎不起作用: sed 's/^.*\[client\(.*\)/\1/g' 我猜“最合适”的工具可能是带有某种Perl模块的Perl?您没有显示

我有一个包含行的文件,其中包含用方括号分隔的字段,例如:

[tag "x"][severity "y"][id "z"][client 1]
我需要从客户端字段提取数据。但我正在努力寻找最好的方法。很明显,对于像cut这样的人来说,它太先进了

我一直在努力使用sed(我甚至不确定sed是否是“最好的”或“最合适的”工具),但像这样的sed正则表达式似乎不起作用:

sed 's/^.*\[client\(.*\)/\1/g'

我猜“最合适”的工具可能是带有某种Perl模块的Perl?

您没有显示预期的输出,因此这是一个猜测,但基于您发布的脚本试图执行的操作-这是您想要的吗

$ sed 's/.*\[client *\([^]]*\).*/\1/g' file
1

在Perl中,您可以捕获每个括号内容,如下所示:

$ perl -lne 'print $1 while /(?<=\[)([^\]]+)(?=\])/g' file
tag "x"
severity "y"
id "z"
client 1

正如在评论中指出的,
/\[([^\]]+)\]/g
可能更有效一些

$ perl -lne 'for (/\[([^\]]+)\]/g) { print if /^client\b/}' file
client 1

我会使用
tr-d

echo '[tag "x"][severity "y"][id "z"][client 1]' | tr -d '[]'
tag "x"severity "y"id "z"client 1

没有必要向前看和向后看<代码>/\[([^\]+)\]/g就可以了。@MaartenBodewes哇!谢谢你来找我!对不起,我把它删掉了,我被反对者和下层选民赶了出来,我试图解释我的理由,但这似乎只会让事情变得更糟。但不管怎样,我感谢你的慷慨,所以我会找到我要删除它的地方,为了你的荣誉,我要删除它。再次感谢
echo '[tag "x"][severity "y"][id "z"][client 1]' | tr -d '[]'
tag "x"severity "y"id "z"client 1
echo '[tag "x"][severity "y"][id "z"][client 1]' | awk -F'[][]+' '{print $5}'

client 1