我的文件结构如下:
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
答案 0 :(得分:1)
问题在于输入文件中的行尾约定和sed期望的不同。您的输入文件使用DOS行尾约定,其中行的末尾标有2字节序列0x0d 0x0a
。相反,sed期望UNIX 1字节约定0x0a
。在过去的日子里,0x0d
实际上意味着'回车'而0x0a
意味着'走一条线'。
因此,当您运行sed
时,它只会替换一个字节0x0a
,而不可打印的回车符0x0d
。
我建议通过执行
删除所有回车字节tr -d '\r' < file_DOS > file_UNIX
然后像以前一样继续。请注意,如果您的文字包含不可打印的字符,则可能会弄乱您的数据。