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

时间:2017-02-27 14:33:03

标签: bash command-line

这是针对mac osx终端的 说我有一个文件让我们说
    file.txt的

This is a file  
and it has some contents.  

我需要一个命令将其更改为:
file.txt的

(new line character inserted)      
This is a file  
and it has some contents

6 个答案:

答案 0 :(得分:3)

您可以在osx上使用ed

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

答案 1 :(得分:2)

这可以完全在bash中完成,无需使用sedcat等外部工具。

printf '\n%s' "$(< file.txt)"

请注意,这会将修改后的输出打印到“stdout”。它还会删除输入文件中的所有尾随换行符。如果这是一个问题,那么您将回到cat ...

( printf '\n'; cat 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

当然,这也否定了“没有外部工具”的好处,因为mktemprmmv没有内置到bash中。

更便携的基于sed的解决方案可能如下所示:

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

上述解决方案不是依赖于sed能够扩展\n,而是使用bash“格式扩展”来添加换行符,其中包含适用于其他sed变体的方法。

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

答案 2 :(得分:1)

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

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

效率略低,但在所有极端情况下都是正确的。

答案 3 :(得分:0)

使用sed内联注入会这样做:

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

答案 4 :(得分:0)

用于添加空行的简单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'

答案 5 :(得分:-2)

echo -e "\n$(cat file.txt)" > file.txt

然而,正如@EricRenouf所说,如果文件中还有其他转义序列,它们将被扩展。