用一个替换多个逗号 - linux命令

时间:2015-07-14 07:42:42

标签: linux replace sed command-line-interface

这是我的谷歌csv联系人(包含超过1000个联系人)的输出:

A-Tech Computers Hardware,A-Tech Computers,,Hardware,,,,,,,,,,,,,,,,,,,,Low,,,* My Contacts,,,,,,,,,Home,+38733236313,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

我需要一个linux cli命令来替换重复的逗号,使用单个逗号,所以我明白了:

A-Tech Computers Hardware,A-Tech Computers,Hardware,Low,* My Contacts,Home,+38733236313,

我在记事本++中通常做的是用“,”六次替换“,,”。

我尝试过:

cat googlecontacts.txt | sed -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g'  -e 's/,,/,/g' -e 's/,,/,/g' -e 's/,,/,/g' > google.txt

但它不起作用...... 但是,当我在较小的文件(两行)上尝试时,它可以工作...... :(

请帮忙!

4 个答案:

答案 0 :(得分:2)

假设您的线路在修改后仍然符合要求(不是问题的关注点)

sed 's/,\{2,\}/,/g' googlecontacts.txt > google.txt
  • 它替换任何大于1 ,的任何出现位置的,任意位置
  • ,之间的任何空格都被视为正确的字段,因此未经修改

在你的命令中,你需要递归改变角色而不是多次重复执行(总有一个gretear出现),就像这样

cat googlecontacts.txt | sed ':a
# make your change
s/,,/,/g
# if change occur, retry once again by returning to line :a
t a' > google.txt

答案 1 :(得分:2)

您需要squeeze的{​​{1}}选项:

tr

你可以这样看待它:

tr -s ',' < yourFile

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed 's/,,*/,/g' file

sed 's/,\+/,/g' file

答案 3 :(得分:0)

感谢@potong,您的解决方案可以满足我的要求之一。我不得不更换|文件第一行中的符号,并使用此解决方案进行了少量更改。

sed -i "1s/|'*//g" ${filename} 

我无法添加评论,因此想到将其发布为答案。请原谅