unix命令将文本预加到文件

是否有一个unix命令将某些string数据前置到文本文件?

就像是:

prepend "to be prepended" text.txt 

谢谢!

 sed -i.old '1s;^;to be prepended;' inFile 

-i修饰符用于写入更新,并在给定的扩展名的情况下进行备份。 1s;^;replacement-string; 用给定的replacestringreplace第一行的开头; 作为命令分隔符。

 echo -e "to be prepended\n$(cat text.txt)" > text.txt 

这是一个可能性:

 (echo "to be prepended"; cat text.txt) > newfile.txt 

你可能不会轻易绕过一个中间文件。

替代scheme(对于shell转义可能很麻烦):

 sed -i '0,/^/s//to be prepended/' text.txt 

这将用于形成输出。 – 意味着标准input,通过pipe道提供回声。

 echo -e "to be prepended \n another line" | cat - text.txt 

要重写文件,需要一个临时文件,因为不能pipe回input文件。

 echo "to be prepended" | cat - text.txt > text.txt.tmp mv text.txt.tmp text.txt 

喜欢Adam的回答

我们可以使海绵更容易使用。 现在,我们不需要创build一个临时文件并将其重命名

 echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt 

可能没有什么内置的,但你可以很容易地写出你自己的,就像这样:

 #!/bin/bash echo -n "$1" > /tmp/tmpfile.$$ cat "$2" >> /tmp/tmpfile.$$ mv /tmp/tmpfile.$$ "$2" 

至less有这样的东西…

我很惊讶没有人提到过程替代

 cat <(echo "to be prepended") text.txt > newfile.txt 

这可以说是比任何其他答案更自然(打印一些东西,并将其pipe道化为替代命令是词典上反直觉)。

…并劫持上面说的ryan, sponge你不需要临时文件:

 sudo apt-get install moreutils <<(echo "to be prepended") < text.txt | sponge text.txt 

编辑:看起来像这在Bourne Shell /bin/sh不起作用


实际上使用这个string – <<< (再次,你需要bash),你可以这样做:

 <<< "to be prepended" < text.txt | sponge text.txt 

另一个相当直接的解决scheme是:

  $ echo -e "string\n" $(cat file) 

如果可以replaceinput文件

注意:这样做可能会有意想不到的副作用 ,特别是用常规文件replace符号链接,可能会以文件的不同权限结束,并更改文件的创builddate

sed -i ,正如约翰·韦斯利(John Wesley)王子的答案 ,试图至less恢复原来的权限,但其他的限制也适用

  { printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt 

注意:使用命令{ ...; ... } { ...; ... }比使用子shell(...; ...) )更高效。


如果input文件应该进行编辑(保留其所有属性的inode)

使用历史悠久的POSIX实用程序 :

注意: ed总是首先将input文件作为一个整体读入到内存中。

 ed -s text.txt <<'EOF' 1i line 1 line 2 . w EOF 
  • -s抑制ed的状态消息。
  • 请注意,如何将命令作为多行的here-document ( <<'EOF' ... EOF )提供,即通过stdin提供
  • 1i使1 (第一行)成为当前行并开始插入模式( i )。
  • 以下行是在当前行之前插入的文本,以终止. 在自己的路线。
  • w将结果写回input文件(用于testing,用wreplacew ,p打印结果,而不修改input文件)。

使用sed另一种方法是:

 sed -i.old '1 {i to be prepended }' inFile 

如果要添加的行是多行的:

 sed -i.old '1 {i\ to be prepended\ multiline }' inFile 

在某些情况下,前缀文本只能从标准input中获得。 那么这个组合应该工作。

 echo "to be prepended" | cat - text.txt | tee text.txt 

如果你想省略tee输出,那么追加> /dev/null

如果你喜欢vi / vim,这可能更适合你的风格。

 printf '0i\n%s\n.\nwq\n' prepend-text | ed file 
 # create a file with content.. echo foo > /tmp/foo # prepend a line containing "jim" to the file sed -i "1s/^/jim\n/" /tmp/foo # verify the content of the file has the new line prepened to it cat /tmp/foo