2013-01-14 84 views
0

我有结构化的这样一个文件:桑达在一行以 n中的末尾添加一个字

word1 word2 word3 
word4 word5 word6 

,我用命令

sed -i '1s/$/word7/' file 

添加单词“word7”在第一行的末尾

的问题是,这个词是不是在第一行的末尾添加,它补充这样的:

word1 word2 word3 
word7 
word4 word5 word6 

但是当我运行'wc -l file'命令时,我的文件的行数没有改变(它仍然是2)!

我想也许这是该文件的创建,它是由一个C程序用这种语法创建了一个问题:

fprintf(file, "word1 word2 word3 \n"); 

我不能再运行我的C程序,所以我应该运行什么bash命令来获得:

word1 word2 word3 word7 
word4 word5 word6 

+1

恕我直言,你错过了word7之前的空间。其余的为我工作如预期。请在结果上使用'hexdump'或者'od -xa'。 –

+0

我尝试了空间,它仍然无法正常工作。我如何准确使用hexdex?其他“有趣”的事实:如果我手动打开我的文件,修改它并保存,'wc -l file'会给我0行! – Sulli

+0

@Sullivan Orlean: hexdump使用'hd -c file' –

回答

1

问题在于输入文件中的行尾约定以及sed期望值是不同的。您的输入文件使用DOS行尾约定,其中行的末尾用2字节序列0x0d 0x0a标记。相反,sed期望UNIX 1字节约定0x0a。在过去,0x0d实际上意味着'回车'而0x0a意味着'一行下去'。

因此,当您运行sed时,它仅替换一个字节0x0a,使不可打印的回车符返回0x0d

我会建议做

tr -d '\r' <file_DOS> file_UNIX 

删除所有回车字节,然后像以前一样继续进行。请注意,如果您的文字包含不可打印的字符,这可能会弄乱您的数据。

相关问题