![如何使用 sed 替换一行中多个双引号单词中的字符?](https://linux22.com/image/46673/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E4%B8%80%E8%A1%8C%E4%B8%AD%E5%A4%9A%E4%B8%AA%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%8D%95%E8%AF%8D%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我有包含这样的文本格式的文本文件。
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"