2012-05-23 24 views

回答

10

在2个步骤:

content=$(cat file.txt) # no cat abuse this time 
echo -en "foobar\n$content" >file.txt 
+1

仍然可以避开'cat': 'content =“$(

+0

@MarkReed有一个有趣的建议,可以在bash中使用,但不能在破折号中使用。我相信这是bash行为不符合语言规范的另一个例子,因为'在zsh中产生输出,但不在bash中产生。 –

+0

请注意,以这种方式设置内容将放弃文件中的所有尾部空白,包括最终换行符。 –

6

这是非标准的,但如果你的sed支持-i,你可以这样做:

sed -i '1i\ 
Foobar' file.txt 
+0

我不认为\是必要的。 '1i Foobar'应该可以工作。 – dogbane

+0

@dogbane忽略掉换行符在某些sed中可用,但不是全部。如果它被遗漏,许多sed会窒息。 –

3

我会保持它的简单。最简单的,可能最快的解决方法非常简单:

(echo "Foobar"; cat file.txt) >tmpfile 
cp tmpfile file.txt 
rm tmpfile 

如果不要紧,file.txt的索引节点的变化,由“MV”取代“CP”。比这更快的解决方案是不可能的,因为Unix文件系统语义不支持预先添加到文件,只能附加。

+1

而不是cp和删除,为什么不只是'mv tmpfile.txt file.txt'? –

+0

'如果'file.txt'的inode更改无关紧要,请将“cp”替换为“mv”' –

+1

您真正关心inode更改的频率如何? –

相关问题