【问题标题】:Sed add a word at the end of a line with \nsed 在行尾添加一个单词 \n
【发布时间】:2013-01-14 09:11:47
【问题描述】:

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

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

?

【问题讨论】:

  • 恕我直言,您错过了 word7 之前的空格。其余的按预期对我有用。请在结果上尝试hexdumpod -xa
  • 我用空间试过了,还是不行。我如何准确地使用hexdex?其他“有趣”的事实:如果我手动打开我的文件,修改它并保存它,'wc -l 文件'给我 0 行!
  • @Sullivan Orlean:用于 hexdump 使用 hd -c file
  • 你也可以这样做:cat -v file,这通常足以看到特殊字符(但有时可能还不够)。问题可能出在生成文件时:服务器 C 编译器的“\n”可能与您使用 sed 的机器上的“\n”不同。尝试查看每个服务器的LC_LANG 值。
  • 我不知道是谁删除了下面的答案,解决方案的所有信息都在哪里!我的问题是我的文件有 Windows 结束行字符,我可以使用命令“file myFile”看到这些字符。我所要做的就是一个“dos2unix myFile”命令让 sed 正常工作

标签: bash sed newline


【解决方案1】:

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

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

我建议删除所有回车字节

tr -d '\r' < file_DOS > file_UNIX

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多