我有包含这样的文本格式的文本文件。
012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"
如何使用 sed 通过管道(|)运算符仅在双引号内替换单词内的逗号。我需要这样的输出:
012345,"[ThinkPadT2/3Gband | Mac]",Lenovo,"iPhone3G|A1241"
答案1
这是制作的标准程序sed
非贪婪和反向引用括号中子字符串的提示()
sed 's/\(\"[^",]\{1,\}\),\([^",]\{1,\}\"\)/\1 | \2/g'
或者对于 GNUsed
sed -r 's/("[^",]+),([^",]+")/\1 | \2/g'
答案2
你可以尝试这样的事情:
$ cat filename
012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"
$ cat filename | sed -E 's:([A-Z,a-z]),([A-Z,a-z]):\1|\2:g'
012345,"[ThinkPadT2/3Gband|Mac]",Lenovo,"iPhone3G|A1241"
答案3
Sed 不是适合此目的的工具。我认为可能需要一些高级功能才能实现像上面这样的功能。这是 perl 在线程序,它将双引号内出现的任意数量的双逗号替换为<space>|<space>
。
$ echo '012345,"[ThinkPadT2/3Gband,Mac,Apple]",Lenovo,"iPhone3G,A1241"' | perl -pe 's/,(?!(?:"[^"]*"|[^"])*$)/ | /g'
012345,"[ThinkPadT2/3Gband | Mac | Apple]",Lenovo,"iPhone3G | A1241"