2013-02-08 172 views
0

我想添加一个额外的列到一个制表符分隔的文件。 该文件是这样的:sed添加额外的列

#> cat /tmp/myfile 
Aal  Fisch_und_Fleisch 
Aalsuppe  Fisch_und_Fleisch 

我想要做的方式是通过SED,匹配全行,用新列打印出来一起。然而,其他列上写的是线,而不是末端的中间:

#> cat /tmp/myfile | sed 's#^\(.*\)$#\1\t1#g' 
Aal  1isch_und_Fleisch 
Aalsuppe1  Fisch_und_Fleisch 

当我做了一些它的工作原理手动创建线路进行仔细的检查,但:

#> echo -e "aaaaaaaaaa\taaaaaaaaaaaa\nbbbbbbb\tbbbbbbbb" | sed 's#^\(.*\)$#\1\t1#g' 
aaaaaaaaaa  aaaaaaaaaaaa 1 
bbbbbbb bbbbbbbb  1 

我猜对了可能是一个编码/换行符的问题,这里是file是说:

#> file /tmp/myfile 
/tmp/myfile: ASCII text, with CRLF line terminators 

如果它是一个编码/换行符的问题,我该怎么做呢?

+0

既然你在捕获的组后面有'$','sed'必须在行中间检测到一个换行符,这对我来说似乎很陌生。 – 2013-02-08 11:42:34

回答

3

我无法重现您的具体问题,但在此之前已经看到了类似的事情。实质上,CRLF行结束会导致视觉显示中的奇怪现象,因为CR部分(回车符)会导致光标移动到同一行的开头,而不是移动到新行的开头。最简单的可能只是切换到Unix风格的结局。

要切换到Unix风格的结尾,使用

dos2unix 
tr -d '\r' 

一个作为一个整体,像

cat /tmp/myfile | dos2unix | sed 's#^\(.*\)$#\1\t1#g' 

如果需要切换,你可以使用unix2dos

1

这可能为你工作(GNU SED):

sed 's/$/\t1/' file 
+1

这比OP的版本简单,但问题不是错误的'sed'命令。 OP的命令也起作用。 – 2013-02-08 11:44:57

+0

比我的好多了,谢谢! – benroth 2013-02-08 12:36:29