echo -n 'I hate cats' > cats.txt
sed -i '' 's/hate/love/' cats.txt
Run Code Online (Sandbox Code Playgroud)
这会正确更改文件中的单词,但也会在文件末尾添加换行符.为什么?这只发生在OSX中,而不是Ubuntu等.我该如何阻止它?
echo -n 'I hate cats' > cats.txt
Run Code Online (Sandbox Code Playgroud)
此命令将使用单引号之间的11个字符填充'cats.txt'的内容.如果你在这个阶段检查cats.txt的大小,它应该是11个字节.
sed -i '' 's/hate/love/' cats.txt
Run Code Online (Sandbox Code Playgroud)
该命令将读取该文件cats.txt 一行行,并与其中每行已通过"爱"(如果这种情况存在的话)替换成"恨"的第一个实例文件替换它.重要的是要了解一条线是什么.从sed手册页:
Normally, sed cyclically copies a line of input, not including its
terminating newline character, into a pattern space, (unless there is
something left after a ``D'' function), applies all of the commands
with addresses that select that pattern space, copies the pattern
space to the standard output, appending a newline, and deletes the
pattern space.
Run Code Online (Sandbox Code Playgroud)
注意appending a newline
部分.在您的系统上,即使没有终止换行符,sed仍将您的文件解释为包含一行.因此输出将是11个字符,加上附加的换行符.在其他平台上,情况不一定如此.有时sed将完全跳过文件中的最后一行(实际上删除它),因为它实际上不是一行!但在你的情况下,sed基本上是为你修复文件(作为一个没有行的文件,它是sed的输入断开).
在此处查看更多详细信息:为什么文本文件以换行符结尾?
有关问题的替代方法,请参阅此问题:SED在最后添加新行
如果您需要一个不会添加换行符的解决方案,您可以使用gsed
(brew install gnu-sed
)
归档时间: |
|
查看次数: |
6826 次 |
最近记录: |