我的文件包含的行包含用方括号分隔的字段,例如:
[tag "x"][severity "y"][id "z"][client 1]
我需要从客户端字段中提取数据。但我正在努力做到最好的方法。显然它对于 cut 这样的东西来说太先进了。
我一直在努力使用 sed (我甚至不确定sed是“最好的”或“最合适的”工具),但像这样的sed正则表达式似乎不起作用:
sed 's/^.*\[client\(.*\)/\1/g'
我猜测“最合适”的工具可能是带有某种Perl模块的Perl?
答案 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