Sed使用\ n在行尾添加一个单词

时间:2013-01-14 09:11:48

标签: bash sed newline

我的文件结构如下:

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 个答案:

答案 0 :(得分:1)

问题在于输入文件中的行尾约定和sed期望的不同。您的输入文件使用DOS行尾约定,其中行的末尾标有2字节序列0x0d 0x0a。相反,sed期望UNIX 1字节约定0x0a。在过去的日子里,0x0d实际上意味着'回车'而0x0a意味着'走一条线'。

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

我建议通过执行

删除所有回车字节
tr -d '\r' < file_DOS > file_UNIX

然后像以前一样继续。请注意,如果您的文字包含不可打印的字符,则可能会弄乱您的数据。