Answers:
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命令中,第一个$意思是“仅在最后一行执行以下命令”,该命令s/REGEX/REPLACEMENT/将REGEX替换为REPLACEMENT,并且正则表达式$在该行的末尾匹配。
Linux的sed命令具有内置功能,可自动执行此创建新文件和替换序列,因此您可以将其缩短为
sed -i '$ s/$/abc/' file.txt
⁰ 这是一个空字节,ASCII调用NUL,而Unicode调用U + 0000。文本处理程序可能会也可能无法应付此字符。
1 请参见IEEE 1003.1-2008:2016 的“ 基本定义”一章的“定义”部分中的“ 文本文件”,“ 行 ”和“ 换行符 ”的定义。
0x41(ASCII 'A'),那么从技术上讲它不再是文本文件了吗?如果是这样,我建议强调这一点,因为这是一种不直观的定义。如果不是这样,略微改变措词可能有助于避免混淆。
我认为使用echo命令不可行,请改用以下sed方法:
sed -i '$ s/$/abc/' file.txt
-i- 就地修改文件$ -指示最后一条记录/行s/$/abc/- $用子字符串替换行尾abc(用于最后一条记录)date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
'$ s/$/$1/'版画$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)禁止换行符。
echo -n不会在末尾放置换行符abc,但abc仍要在换行符之前,这是用户希望避免的。
\n不会首先出现。更多的选择会更好,尤其是当它们不需要每次更改时都必须重写整个文件时(如果反复执行,它会变得很慢,并且会在多项式时间内运行)。
您想要的是将其添加到最后一行的末尾,即紧接在最后一行的分隔符之前,也就是恰好在文件的最后一个字符之前。
使用ksh93,您可以执行以下操作:
echo abc 1<> file >#((EOF - 1))
在stdout上1<>以读/写模式(更重要的是没有截断)打开文件的标准操作符在哪里,并且>#((...))是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
可能是UUOC,但您也可以这样做:
echo "$(cat file.txt)abc" >file.txt
正如Gilles指出的,此命令是有限的:
这通常有效,但如果有时文件末尾有空白行,而紧接在其后有空白行,则无效。例如,具有固定行数的文件,其中最后一行最初是空的,并且随着时间的推移而扩展,而倒数第二行有时可能是空的。
此外,请谨慎使用cat您不熟悉的文件:
结论:
使用sed
echo:p
cat,而与发送到终端的任意转义序列有关。