0

我有一个结构如下的文件:

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

?

4

1 回答 1

1

问题是输入文件中的行尾约定和 sed 期望的不同。您的输入文件使用 DOS 行尾约定,其中行尾标有 2 字节序列0x0d 0x0a。相反, sed 需要 UNIX 1 字节约定0x0a。过去0x0d实际上是“回车”的意思,0x0a意思是“下一行”。

所以当你运行时sed,它只替换一个字节0x0a,留下不可打印的回车0x0d

我建议通过执行删除所有回车字节

tr -d '\r' < file_DOS > file_UNIX

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

于 2013-01-14T17:54:07.843 回答