Bash 如何在文件的第一行插入新行字符(\n)?

Bash 如何在文件的第一行插入新行字符(\n)?,bash,command-line,Bash,Command Line,这是针对mac osx终端的 假设我有一个文件,比如说 file.txt This is a file and it has some contents. 我需要一个命令将其更改为: file.txt This is a file and it has some contents. 然而,正如@EricRenouf所述,如果文件中有其他转义序列,它们将被展开 但是,正如@EricRenouf所述,如果文件中有其他转义序列,它们将被展开。使用sed内联注入执行以下操作: sed

这是针对mac osx终端的
假设我有一个文件,比如说
file.txt

This is a file  
and it has some contents.  
我需要一个命令将其更改为:
file.txt

This is a file  
and it has some contents.  
然而,正如@EricRenouf所述,如果文件中有其他转义序列,它们将被展开


但是,正如@EricRenouf所述,如果文件中有其他转义序列,它们将被展开。

使用
sed内联注入执行以下操作:

sed -i '1s/^/\n/' file.txt

使用
sed
注入内联执行以下操作:

sed -i '1s/^/\n/' file.txt

这可以完全在bash中完成,无需使用外部工具,如
sed
cat

printf '\n%s' "$(< file.txt)"
见鬼,如果你想反复使用它,你可以把它变成一个函数:

prepend_newline() {
    printf '\n'; cat "$1"
}
如果要替换原始文件,可以使用临时文件和一点包装:

tmpf=$(mktemp fileXXXX)
trap "rm -f $tmpf" 0
printf '\n%s' "$(< file.txt)" > $tmpf &&
mv $tmpf file.txt
上面的解决方案使用bash“format expansion”来添加换行符,而不是依赖sed来扩展
\n
,该方法也适用于其他sed变体


正如在评论中所建议的那样,
-i
不是普遍的,只是普遍存在。如果您的sed不包含
-i
,请参阅上面的包装。

这可以完全在bash中完成,无需使用外部工具,如
sed
cat

printf '\n%s' "$(< file.txt)"
见鬼,如果你想反复使用它,你可以把它变成一个函数:

prepend_newline() {
    printf '\n'; cat "$1"
}
如果要替换原始文件,可以使用临时文件和一点包装:

tmpf=$(mktemp fileXXXX)
trap "rm -f $tmpf" 0
printf '\n%s' "$(< file.txt)" > $tmpf &&
mv $tmpf file.txt
上面的解决方案使用bash“format expansion”来添加换行符,而不是依赖sed来扩展
\n
,该方法也适用于其他sed变体


正如在评论中所建议的那样,
-i
不是普遍的,只是普遍存在。如果sed不包含
-i
,请参阅上面的包装。

最简单的方法是使用两个命令:

{ printf '\n'; cat input.txt; } > tmp.txt && mv tmp.txt input.txt

这比可能的效率稍低,但在所有情况下都是正确的。

最简单的方法是使用两个命令:

{ printf '\n'; cat input.txt; } > tmp.txt && mv tmp.txt input.txt

这比可能的效率稍低,但在所有情况下都是正确的。

您可以在osx上使用
ed

printf '%s\n' 0a "" . w | ed -s file

您可以在osx上使用
ed

printf '%s\n' 0a "" . w | ed -s file

一个简单的
ed
命令,用于在空行前面加上前缀,如下所示

1i  # insert before line 1
    # blank line to insert
.   # end of insert
w   # write the file
这可以在Bash命令中写成

ed -s "$file" <<<$'1i\n\n.\nw'

ed-s“$file”一个简单的
ed
命令,用于在空行前加上前缀

1i  # insert before line 1
    # blank line to insert
.   # end of insert
w   # write the file
这可以在Bash命令中写成

ed -s "$file" <<<$'1i\n\n.\nw'


ed-s“$file”是否仅对一个文件执行此操作?如果是这样,为什么不在文本编辑器中打开文件,按第一行的enter键,然后保存文件?欢迎使用StackOverflow!为了将来参考,这里的质量问题包括您自己解决此问题的尝试。请查看SO文档-了解如何创建编程问题的示例,以及更全面的提问指南。我不是只针对一个文件这样做。我是在使用nodejs的exec模块向文件追加新行。我要添加新行的文件是在运行时由grunt watcher提供的。您是否只针对一个文件这样做?如果是这样,为什么不在文本编辑器中打开文件,按第一行的enter键,然后保存文件?欢迎使用StackOverflow!为了将来参考,这里的质量问题包括您自己解决此问题的尝试。请查看SO文档-了解如何创建编程问题的示例,还有一个更全面的提问指南。我不是只针对一个文件。我是在使用nodejs的exec模块向文件中添加新行。我要添加新行的文件是在运行时由grunt watcher提供的。这适用于GNU sed,但不能移植到其他变体。@ghoti这是正确的。还应注意的是,
sed-i
要求对父目录而不是文件本身具有写权限。这适用于GNU-sed,但不能移植到其他变体。@ghoti这是正确的。还应注意的是,
sed-i
需要对父目录而不是文件本身具有写权限。这还将扩展文件中的任何转义序列,这可能不是所需的。此外,如果重定向位于该位置,则文件中可能只会出现
\n
,由于重定向将首先发生,因此截断文件和
cat
将没有可处理的输出。如果
echo
是一个内置的而不是一个可执行文件,那么这可能会起作用。请详细说明您的第一条评论好吗?我在文本文档的开头得到一个空行,而不是\n。请将
\t
放入文本文件中,然后再试一次。@EricRenouf命令替换将在处理重定向之前完成,因此这不成问题。这还将扩展文件中可能不需要的任何转义序列。此外,如果将重定向放在该位置,您很可能会在文件中找到
\n
,因为重定向将首先发生,因此会截断文件,而
cat
将没有可处理的输出。如果
echo
是一个内置的而不是一个可执行文件,那么这可能会起作用。请详细说明您的第一条评论好吗?我在文本文档的开头得到一个空行,而不是\n。请将
\t
放入文本文件中,然后再试一次。@EricRenouf命令替换将在处理重定向之前完成,因此这不成问题。尽管
printf
解决方案会丢失终止文件最后一行的新行,如果有。
sed-i
不可移植。@EricRenouf-
printf“%s”
确实会删除尾随的换行符,但这是因为
$(…)
,而不是因为printf。当然,如果OP需要,添加一个尾随的
\n
很容易。它不仅会删除一个尾随的换行符,还会删除所有尾随的换行符。墨菲定律:你可以发送一个不需要的
sed