到目前为止,我已经能够找出如何在文件的开头添加一行,但这并不完全是我想要的。我将用一个例子来说明:

文件内容

some text at the beginning

结果

<added text> some text at the beginning

它很相似,但是我不想用它创建任何新的行…

如果可能的话,我希望用sed来做这件事。


当前回答

我的观点是:

sed  -i '1i /path/of/file.sh' filename

即使字符串中包含正斜杠"/"

其他回答

嗨,用马车回:

sed -i '1s/^/your text\n/' file

使用shell:

echo "$(echo -n 'hello'; cat filename)" > filename

不幸的是,命令替换将删除文件末尾的换行符。为了保持它们,人们可以使用:

echo -n "hello" | cat - filename > /tmp/filename.tmp
mv /tmp/filename.tmp filename

既不需要分组,也不需要命令替换。

Sed可以对地址进行操作:

$ sed -i '1s/^/<added text> /' file

每个答案上神奇的1是什么?行解决!

想在前10行添加<添加的文本> ?

$ sed -i '1,10s/^/<added text> /' file

或者你可以使用命令分组:

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}

只是为了好玩,这里有一个使用ed的解决方案,它没有不能处理空文件的问题。您可以把它放到一个shell脚本中,就像这个问题的任何其他答案一样。

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

上面的脚本将要插入的文本添加到第一行,然后连接第一行和第二行。为了避免ed在无效连接错误时退出,它首先在文件末尾创建一个空行,如果它仍然存在,则稍后删除它。

限制:如果<added text>恰好等于单个句点,此脚本将不起作用。

echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

第一个tac反向传输文件(最后一行先传输),因此“要插入的文本”出现在最后。第2个tac再次将其换行,因此插入的行位于开头,原始文件保持原始顺序。