gpt4 book ai didi

regex - sed regex 匹配多个字段和值,包括引号

转载 作者:行者123 更新时间:2023-12-03 17:13:09 25 4
gpt4 key购买 nike

我有一个(空格分隔的)输入文件,其中包含以下行:

field1=value1 field2="value 2" field3='value 3' field4="value '4'" ...

字段数因行而异。为了正确处理此类文件,我希望 sed它并获得一些表格分隔的输出,例如:
field1 (tab) value1 (tab) field2 (tab) value 2 (tab) field3 (tab) value 3 (tab) field4 (tab) value '4'

到目前为止,我走得最远的是诸如 sed "s/\([a-z][a-z]*\)=\(['\"]\{0,1\}\)\(..*?\)\2/\t\1\t\3/g" 之类的东西。但离解决我的问题太远了。我的困难是正确处理值的分隔符(引号)的缺失或存在。为了优雅(或极客),我坚持 sed ,但也会考虑 awk选择。

在此先感谢您的帮助,

编辑 :我很震惊地说,但@Jotne 是对的。
echo "field1=value1 field2=\"value 2\" field3='value 3' field4=\"value '4'\"" | sed "s/\([a-z][a-z]*\)=\(\([^ ][^ ]*\)\|'\([^'][^']*\)'\|\"\([^\"][^\"]*\)\"\)/\1\t\3\4\5\t/g"

不起作用:
field1=value1 field2="value 2"field3='value 3' field4="value '4'"`

尽管以下(背后的想法是解析 audit.log 文件)有效:
root@XXX:~# tail -n 2 /var/log/audit/audit.log 
type=CRED_DISP msg=audit(1570385821.075:670): pid=32605 uid=0 auid=0 ses=399 msg='op=PAM:setcred acct="root" exe="/usr/sbin/cron" hostname=? addr=? terminal=cron res=success'
type=USER_END msg=audit(1570385821.075:671): pid=32605 uid=0 auid=0 ses=399 msg='op=PAM:session_close acct="root" exe="/usr/sbin/cron" hostname=? addr=? terminal=cron res=success'
root@XXX:~# tail -n 2 /var/log/audit/audit.log | sed "s/\([a-z][a-z]*\)=\(\([^ ][^ ]*\)\|'\([^'][^']*\)'\|\"\([^\"][^\"]*\)\"\)/\1\t\3\4\5\t/g"
type CRED_DISP msg audit(1570385821.075:670): pid 32605 uid 0 auid 0 ses 399 msg op=PAM:setcred acct="root" exe="/usr/sbin/cron" hostname=? addr=? terminal=cron res=success
type USER_END msg audit(1570385821.075:671): pid 32605 uid 0 auid 0 ses 399 msg op=PAM:session_close acct="root" exe="/usr/sbin/cron" hostname=? addr=? terminal=cron res=success

为什么?

最佳答案

这可能对你有用(GNU sed):

sed -E 's/ \<([^ =]+)=("[^"]*"|'\''[^'\'']*'\'')/\t\1\t\2/g;s/=/\t/' file

第一个替换替换所有 = 's 和间隔字段,第一个字段除外。第二次替换纠正了第一次。

关于regex - sed regex 匹配多个字段和值,包括引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com