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,用w
replacew
,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