这里有我的情景。文本文件看起来像这样
"1","2,c","3","4,a","7"
"8","9,c","4","6,d","9"
所以我想要的是用( - )
替换(,)ex - 而不是“2,c”为“2-c”我只需要在“”内部使用逗号进行更改而不是用于csv文件的其他逗号分隔。这应该全球改变
谢谢!
答案 0 :(得分:4)
s#([^"]),([^"])#\1-\2#g
适用于您的示例:
$ cat example
"1","2,c","3","4,a","7"
"8","9,c","4","6,d","9"
$ sed -E -e 's#([^"]),([^"])#\1-\2#g' example
"1","2-c","3","4-a","7"
"8","9-c","4","6-d","9"
sed表达式分解为“替换所有不在,
个"
个字符之间的-
个字符”。
编辑:OP的sed
不支持扩展(现代)正则表达式,所以这是一个BRE示例:
$ sed -e 's#\([^"]\),\([^"]\)#\1-\2#g' example
"1","2-c","3","4-a","7"
"8","9-c","4","6-d","9"
答案 1 :(得分:1)
我已经做了很多全球替换并且有另一种选择,你可能只是在这里让生活变得太复杂。如果使用emacs编辑器,则只需执行三个全局替换语句:
M-x repl-s“,”“ - ”用唯一的字符串替换“,”,然后只是
M-x repl-s'用空格替换所有剩余的',然后用其他逗号返回
M-x repl-s“ - ”“,”我知道这不是一个严格的sed示例,但我认为它可能提供了一个不错的选择。我有时候喜欢只是跳进文本编辑器而不是把所有东西都拿出来,但那可能就是我。