附加带有 echo 的文本而不换行

附加带有 echo 的文本而不换行

我想将文本附加到文件,例如echo "abc" >>file.txt

但这abc在新行之后添加

如何abc在文件末尾添加 echo 而不换行?

答案1

假设文件尚未以换行符结尾,而您只是想附加一些文本而不添加文本,则可以使用该-n参数,例如

echo -n "some text here" >> file.txt

但是,某些 UNIX 系统不提供此选项;如果是这种情况你可以使用printf,例如

printf %s "some text here" >> file.txt

(最初的%s论点是防止附加文本%中包含格式化字符)

来自man echo(在 macOS High Sierra 上):

-n

不打印尾随换行符。这也可以通过附加'\c'到字符串末尾来实现,如 iBCS2 兼容系统所做的那样。请注意,此选项及其效果'\c'是由 Cor 修订的 IEEE Std 1003.1-2001(“POSIX.1”)中实现定义的。 1-2002。强烈鼓励以最大可移植性为目标的应用程序使用printf(1)抑制换行符。

答案2

echo "abc" >>file.txt换行 abc,不是之前。如果您最终得到了abc自己的行,则意味着之前的换行符abc已经存在于file.txt.

请注意,文本文件以换行符结尾是完全正常的。在 Unix 上,一行由除 null⁰ 或换行符之外的一系列字符组成,后跟一个换行符。1因此,任何非空文本文件都以换行符结尾。

如果您想将文本添加到文件的最后一行,则不能使用 来执行此操作>>,因为这总是附加到文件中,因此它总是在最后一个换行符之后写入。相反,您需要一个能够修改现有文件的工具。例如,您可以使用sed:

sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt

在sed命令中,first$表示“仅在最后一行执行以下命令”,该命令s/REGEX/REPLACEMENT/将REGEX替换为REPLACMENT,正则表达式$匹配行尾。

Linux 的 sed 命令有一个内置功能可以自动执行此创建新文件和替换序列,因此您可以将其缩短为

sed -i '$ s/$/abc/' file.txt

这是一个空字节,ASCII 称为 NUL,Unicode 称为 U+0000。文本处理程序可能会也可能不会处理该字符。
1 参见定义文本文件,线, 和换行符在“定义”部分基本定义IEEE 1003.1-2008:2016 的章节。

答案3

我认为使用echo命令是不可能的,请使用以下命令sed相反的方法:

sed -i '$ s/$/abc/' file.txt
  • -i- 修改文件到位
  • $- 指示最后一条记录/行
  • s/$/abc/$- 用子字符串替换行尾abc(对于最后一条记录)

答案4

您想要的是将其添加到最后一行的末尾,即在最后一行的分隔符之前,即文件的最后一个字符之前。

使用ksh93,您可以执行以下操作:

echo abc 1<> file >#((EOF - 1))

1<>以读+写模式打开文件的标准运算符在哪里(更重要的是没有截断) 在 stdout 上并且>#((...))是 ksh93 特定的寻求运算符(此处寻找最后一个字节之前)。请注意,echo写入abc<newline>a覆盖那里的换行符并echo添加自己的换行符。

等价zsh的:

zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file

尽管对于更精确的等价物,您还需要在查找失败时打印一条错误消息:

zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file

相关内容