匹配线子字段用方括号分隔

时间:2017-04-28 18:39:52

标签: perl awk sed

我的文件包含的行包含用方括号分隔的字段,例如:

[tag "x"][severity "y"][id "z"][client 1]

我需要从客户端字段中提取数据。但我正在努力做到最好的方法。显然它对于 cut 这样的东西来说太先进了。

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

那么如果你只想要client匹配,你可以这样做:

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

正如评论中指出的那样,/\[([^\]]+)\]/g可能会更有效率。

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

答案 1 :(得分:2)

你没有显示你的预期输出,所以它是一个猜测,但根据你发布的脚本试图做的是什么 - 这就是你想要的吗?

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

答案 2 :(得分:1)

我会使用tr -d

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

答案 3 :(得分:1)

echo '[tag "x"][severity "y"][id "z"][client 1]' | awk -F'[][]+' '{print $5}'

client 1
相关问题