cho*_*ijj 29 shell io-redirection echo text-processing
我想将文本附加到文件中,例如echo "abc" >>file.txt
.
但这abc
在新行之后添加
如何abc
在没有换行的情况下使用 echo 在文件末尾添加?
flu*_*ffy 31
假设文件还没有以换行符结尾,并且您只想追加一些文本而不添加文本,则可以使用-n
参数,例如
echo -n "some text here" >> file.txt
Run Code Online (Sandbox Code Playgroud)
但是,某些 UNIX 系统不提供此选项;如果是这种情况,您可以使用printf
,例如
printf %s "some text here" >> file.txt
Run Code Online (Sandbox Code Playgroud)
(最初的%s
论点是防止附加文本中包含%
格式字符)
来自man echo
(在 macOS High Sierra 上):
-n
不要打印尾随的换行符。这也可以通过附加
'\c'
到字符串的末尾来实现,正如 iBCS2 兼容系统所做的那样。请注意,此选项以及 的效果'\c'
是由 Cor 修订的 IEEE Std 1003.1-2001(“POSIX.1”)中实现定义的。1-2002 年。强烈建议以最大可移植性为目标的应用程序用于printf(1)
抑制换行符。
Gil*_*il' 21
echo "abc" >>file.txt
在 之后 abc
而不是之前放置一个换行符。如果您以abc
自己的行结束,则意味着之前的换行符abc
已经存在于file.txt
.
请注意,文本文件以换行符结尾是完全正常的。在 unix 上,一行由非空字符序列组成?或换行符后跟换行符。1因此,任何非空文本文件都以换行符结尾。
如果你想在文件的最后一行添加文本,那么你不能用 来做>>
,因为这总是附加到文件中,所以它总是写在最后一个换行符之后。相反,您需要一个能够修改现有文件的工具。例如,您可以使用sed:
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
Run Code Online (Sandbox Code Playgroud)
在sed命令中,第一个$
意思是“只在最后一行执行下面的命令”,该命令s/REGEX/REPLACEMENT/
将REGEX替换为REPLACEMENT,正则表达式$
匹配到行尾。
Linux 的 sed 命令有一个内置功能可以自动执行此创建新文件和替换序列,因此您可以将其缩短为
sed -i '$ s/$/abc/' file.txt
Run Code Online (Sandbox Code Playgroud)
? 这是一个空字节,ASCII 称其为 NUL,Unicode 称其为 U+0000。文本处理程序可能会也可能不会处理这个字符。
1 请参阅IEEE 1003.1-2008:2016基本定义章节的“定义”部分中Text File、Line和Newline Character的定义。
Rom*_*est 16
我认为使用echo
命令是不可能的,请改用以下sed
方法:
sed -i '$ s/$/abc/' file.txt
Run Code Online (Sandbox Code Playgroud)
-i
-就地修改文件$
- 表示最后一条记录/行s/$/abc/
-$
用子字符串替换行尾abc
(最后一条记录)roa*_*ima 12
如果您有该truncate
命令并且您的文本文件的最后一个字符是 NL,您可以将其删除,然后像这样附加您的文本:
truncate --size -1 file.txt
echo "abc" >>file.txt
Run Code Online (Sandbox Code Playgroud)
(请注意,它不truncate
关心文件内容,在此示例中只是将文件大小减少了一个字节。如果您的最后一个字符不是单个字节,即它是一个多字节“宽”字符,那么您将引入损坏。)
你想要的是将它添加到最后一行的末尾,所以就在最后一行的分隔符之前,所以就在文件的最后一个字符之前。
使用ksh93
,您可以执行以下操作:
echo abc 1<> file >#((EOF - 1))
Run Code Online (Sandbox Code Playgroud)
在stdout 上1<>
以读+写模式(更重要的是没有截断)打开文件的标准运算符在哪里,并且>#((...))
是特定于ksh93 的搜索运算符(这里是在最后一个字节之前搜索)。请注意,echo
writes覆盖了abc<newline>
那里的a
换行符并echo
添加了自己的换行符。
将zsh
相当于:
zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file
Run Code Online (Sandbox Code Playgroud)
尽管对于更精确的等效项,您还需要在查找失败时打印错误消息:
zmodload zsh/system
if sysseek -w end -u 1 -1; then
echo abc
else
syserror -p "$0: $LINENO: seek: "
fi 1<> file
Run Code Online (Sandbox Code Playgroud)