删除行尾的逗号


10

如何删除bash中的一组尾随逗号:

a,b,c,d,,,,
1,2,3,,,,

所需输出:

a,b,c,d
1,2,3

尝试这样做:

 grep "5628" test.csv | sed 's/,*$//g'

但这不起作用。该文件最初来自Windows计算机。


2
您确定它不起作用吗?您运行了什么完整命令?
cuonglm,2015年

正。没有。
user2980702 2015年

您能否提供确切的命令(sed显示的没有文件名的功能就充当了过滤器,并且没有就地处理文件)
roaima 2015年

grep“ 5628” test.csv | SED的/,* $ // G'
user2980702

2
如果您需要在* nix中使用文件,而又不需要将其复制回Windows,从长远来看,使用dos2unix或类似的方法将行尾从CR / LF转换为NL可能会更容易。
G-Man说'恢复莫妮卡'

Answers:


13

重新执行您提供的命令:

grep "5628" test.csv | sed 's/,*$//g'

这将输出匹配“ 5628”的行,并删除所有尾随逗号。它不会更新文件test.csv

但是,您指出该文件来自Windows计算机,因此行结尾为CR / NL,而不仅仅是NL。结果是该行的末尾有一个隐藏的CR,您需要一个命令行来代替:

grep "5628" test.csv | sed 's/,*\r*$//'

实际上,您可以将其简单地转换为一个命令:

sed -n '/5628/s/,*\r*$//p' test.csv

我不是要进行就地更新。只需要没有逗号的输出
user2980702

非常有效,谢谢。因此,我们在文件末尾(\ r * $)返回回车之前要查找多个逗号(,*)。我对吗 ?
user2980702 2015年

\r*允许零或更多的CR字符(因此它会继续工作,在Unix / Linux派生文件)。我宁愿使用它\r?来表示一个可选的CR,但我不记得sed要告诉它使用ERE 的标志了。我认为这是-r未经测试的。该,*是你的,匹配零或更多的逗号。
roaima 2015年

g不需要在这种情况下,叔只有1端指定由$
NeronLeVelu

2
sed -n '/5628/ s/,*\r*$//p' test.csv

(不是只要求消除拖尾昏迷的OP),这避免了管道处理,请直接使用过滤器和转换

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.