One*_*ree 108 unix command-line utilities prepend
是否有Unix命令将一些字符串数据添加到文本文件中?
就像是:
prepend "to be prepended" text.txt
Run Code Online (Sandbox Code Playgroud)
shi*_*ime 152
printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
Run Code Online (Sandbox Code Playgroud)
Pri*_*ley 92
sed -i.old '1s;^;to be prepended;' inFile
Run Code Online (Sandbox Code Playgroud)
-i将更改写入到位,并在给出任何扩展名时进行备份.(在这种情况下,.old)1s;^;to be prepended;使用给定的替换字符串替换第一行的开头,使用;命令分隔符.Sri*_*bat 31
我很惊讶没有人提到这一点.
cat <(echo "before") text.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)
这可以说比接受的答案更自然(打印一些东西并将其输入到替换命令中,这是字典上反直觉的).
...并且劫持了上面所说的ryan,sponge你不需要临时文件:
sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt
Run Code Online (Sandbox Code Playgroud)
编辑:看起来这在Bourne Shell中不起作用 /bin/sh
使用here-string - <<<(再次,你需要bash),你可以这样做:
<<< "to be prepended" < text.txt | sponge text.txt
Run Code Online (Sandbox Code Playgroud)
0xC*_*22L 27
这是一种可能性:
(echo "to be prepended"; cat text.txt) > newfile.txt
Run Code Online (Sandbox Code Playgroud)
你可能不会轻易绕过中间文件.
替代方案(shell逃逸可能很麻烦):
sed -i '0,/^/s//to be prepended/' text.txt
Run Code Online (Sandbox Code Playgroud)
Ada*_*dam 16
这将有助于形成输出. - 表示标准输入,通过回声管道提供.
echo -e "to be prepended \n another line" | cat - text.txt
Run Code Online (Sandbox Code Playgroud)
要重写文件,需要临时文件,因为无法管道输入到输入文件中.
echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt
Run Code Online (Sandbox Code Playgroud)
rya*_*yan 14
更喜欢亚当的回答
我们可以更容易地使用海绵.现在我们不需要创建临时文件并将其重命名
echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt
Run Code Online (Sandbox Code Playgroud)
可能没有任何内置功能,但您可以轻松编写自己的内容,如下所示:
#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"
Run Code Online (Sandbox Code Playgroud)
这样的东西至少......
另一种使用方式sed:
sed -i.old '1 {i to be prepended
}' inFile
Run Code Online (Sandbox Code Playgroud)
如果要添加的行是多行:
sed -i.old '1 {i\
to be prepended\
multiline
}' inFile
Run Code Online (Sandbox Code Playgroud)
小智 7
在 Bash(在 Ubuntu 中)中测试,如果从一个测试文件开始,通过;
echo "Original Line" > test_file.txt
你可以执行;
echo "$(echo "New Line"; cat test_file.txt)" > test_file.txt
或者,如果 bash 的版本对于 $() 来说太旧了,你可以使用反引号;
echo "`echo "New Line"; cat test_file.txt`" > test_file.txt
并接收“test_file.txt”的以下内容;
New Line
Original Line
Run Code Online (Sandbox Code Playgroud)
没有中间文件,只有 bash/echo。
如果替换输入文件是可以接受的:
注意:这样做可能会产生意外的副作用,特别是用常规文件替换符号链接,可能最终使用不同的文件权限,以及更改文件的创建(出生)日期.
sed -i,如约翰韦斯利亲王的回答,试图至少恢复原始权限,但其他限制适用.
{ printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt
Run Code Online (Sandbox Code Playgroud)
注意:使用group命令{ ...; ... }比使用subshell((...; ...))更有效.
如果输入文件应该就地编辑(保留其inode及其所有属性):
使用古老的edPOSIX实用程序:
注意:首先ed将输入文件作为整体读入内存.
ed -s text.txt <<'EOF'
1i
line 1
line 2
.
w
EOF
Run Code Online (Sandbox Code Playgroud)
-s被压制ed的状态信息.ed作为多行here-document(<<'EOF' ... EOF)提供,即通过stdin.1i使1(第1行)成为当前行并开始插入模式(i)..以其自己的行终止.w将结果写回到输入文件(用于测试,代替w与,p仅打印的结果,而无需修改所述输入文件).小智 6
在某些情况下,前置文本只能从stdin获得.那么这种组合应该有效.
echo "to be prepended" | cat - text.txt | tee text.txt
Run Code Online (Sandbox Code Playgroud)
如果要省略tee输出,则追加> /dev/null.
解:
printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt
Run Code Online (Sandbox Code Playgroud)
请注意,这对所有类型的输入都是安全的,因为没有扩展.例如,如果你想要前置!@#$%^&*()ugly text\n\t\n,它就会起作用:
printf '%s\n%s' '!@#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt
Run Code Online (Sandbox Code Playgroud)
剩下要考虑的最后一部分是在命令替换期间在文件末尾删除空格"$(cat file.txt)".所有解决方法都相对复杂.如果要在file.txt结尾处保留换行符,请参阅:https://stackoverflow.com/a/22607352/1091436