"echo" 可以在写入文件时停止跳过一行吗

Can "echo" stop skipping a line when writing to a file

我正在尝试使用 echo 命令编辑文件,但是当我这样做时

echo "hello" >> file.txt

它正在跳过一行。它打印文件如下:

banana
apple

hello

我不确定这是来自 echo 还是文件以“\n”结尾,但我想在其余文本下方写下:

banana
apple
hello

编辑:我现在明白这不是 echo 的错。该文件可能以“\n”结尾。反正有绕过这个吗?我可以删除这个“\n”或者选择我想在哪一行写吗?

我找到了将 sed 命令与 wc -l file.txt

一起使用的方法

命令

wc -l file.txt

returns file.txt 的行数(在我的示例中它在 echo 之前有 2 个)。 我们可以使用命令选择哪一行来写我们的文本:

sed -i '2ihello' file.txt

它会给我们:

banana
hello
apple

得到我想要的可以这样做:

echo "aux" >> file.txt

sed -i "3iHello" file.txt
sed '4d' file.txt

最后一个命令删除第 4 行文件然后变成:

banana
apple
Hello

这是另一个 sed 脚本,它没有 hard-code 任何行号。

sed -i '' '${;s/^$/Hello/;t
i\
Hello
}' file.txt 

这里有一个简短的分类:

  • ${ - 大括号中的操作应该只应用于最后一行(地址表达式 $
  • s/^$/Hello/ - 如果此行为空,请将其替换为 Hello
  • t - 如果发生替换,我们就完成了(分支到脚本结尾)
  • i\Hello - 在新行插入 Hello(也就是说,如果我们没有在前一行分支)
  • } - 大括号结束

这是在 MacOS 上测试的;其他 Unix 上的语法可能会略有不同。 (特别是,在 Linux 上,-i 选项不需要参数。除此之外,该脚本在 Debian 上也是如此。一些换行符可能会被删除,但它仍然会工作,但这些在 *BSD sed.)

上是必需的