sed或awk从文本文件中删除(,)

时间:2011-03-25 17:53:23

标签: sed awk

这里有我的情景。文本文件看起来像这样

"1","2,c","3","4,a","7"
"8","9,c","4","6,d","9"

所以我想要的是用( - )

替换(,)

ex - 而不是“2,c”为“2-c”我只需要在“”内部使用逗号进行更改而不是用于csv文件的其他逗号分隔。这应该全球改变

谢谢!

2 个答案:

答案 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示例,但我认为它可能提供了一个不错的选择。我有时候喜欢只是跳进文本编辑器而不是把所有东西都拿出来,但那可能就是我。