如何使用 sed 替换一行中多个双引号单词中的字符?

如何使用 sed 替换一行中多个双引号单词中的字符?

我有包含这样的文本格式的文本文件。

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"

相关内容