我想将文本附加到文件,例如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