是否有Unix命令将一些字符串数据添加到文本文件中?
类似的东西:
prepend "to be prepended" text.txt
答案 0 :(得分:142)
printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
答案 1 :(得分:80)
sed -i.old '1s;^;to be prepended;' inFile
-i
将更改写入到位并在给出任何扩展时进行备份。 (在这种情况下,.old
)1s;^;to be prepended;
使用;
作为命令分隔符,用给定的替换字符串替换第一行的开头。答案 2 :(得分:27)
这是一种可能性:
(echo "to be prepended"; cat text.txt) > newfile.txt
你可能不会轻易绕过中间文件。
替代方案(shell转义可能很麻烦):
sed -i '0,/^/s//to be prepended/' text.txt
答案 3 :(得分:27)
我很惊讶没有人提到这一点。
cat <(echo "before") text.txt > newfile.txt
这可以说比接受的答案更自然(打印一些东西并将其输入到替换命令中是按字典顺序反直觉的。)
...并且劫持了上面所说的ryan,sponge
你不需要临时文件:
sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt
编辑:看起来这在Bourne Shell /bin/sh
使用here-string - <<<
(再次,你需要bash),你可以这样做:
<<< "to be prepended" < text.txt | sponge text.txt
答案 4 :(得分:16)
这将有助于形成输出。 - 表示标准输入,通过回声管道提供。
echo -e "to be prepended \n another line" | cat - text.txt
要重写文件,需要临时文件,因为无法重新输入输入文件。
echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt
答案 5 :(得分:11)
首选亚当answer
我们可以更轻松地使用sponge。现在我们不需要创建临时文件并通过
重命名SELECT main.pricedrop, ifnull(t1.pid, ifnull(t2.pid, t3.pid ))
FROM table_main AS main
LEFT JOIN table1 AS t1
ON main.pid = t1.pid
LEFT JOIN table2 AS t2
ON main.pid = t2.pid
LEFT JOIN table3 AS t3
ON main.pid = t3.pid
ORDER BY main.pricedrop ASC
LIMIT 5;
答案 6 :(得分:7)
在某些情况下,前缀文本只能从stdin获得。 然后这种组合应该有效。
echo "to be prepended" | cat - text.txt | tee text.txt
如果您想省略tee
输出,请附加> /dev/null
。
答案 7 :(得分:7)
可能没有任何内置功能,但您可以轻松编写自己的内容,例如:
#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"
至少这样......
答案 8 :(得分:6)
解决方案:
printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt
请注意,这对所有类型的输入都是安全的,因为没有扩展。例如,如果您想要添加!@#$%^&*()ugly text\n\t\n
,它就会起作用:
printf '%s\n%s' '!@#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt
剩下要考虑的最后一部分是在命令替换"$(cat file.txt)"
期间在文件末尾删除空格。所有解决方法都相对复杂。如果您想在file.txt末尾保留换行符,请参阅:https://stackoverflow.com/a/22607352/1091436
答案 9 :(得分:5)
如果 替换输入文件是可以接受的:
注意:这样做可能会产生意想不到的副作用,特别是用常规文件替换符号链接,可能以文件的不同权限结束,并更改文件的创建(出生)日期即可。
sed -i
,与Prince John Wesley's answer一样,尝试至少恢复原始权限,但适用其他限制。
{ printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt
注意:使用组命令{ ...; ... }
比使用子shell ((...; ...)
)更有效。
如果输入文件应该到位(保留其inode及其所有属性):
使用古老的ed
POSIX utility:
注意:ed
总是首先将输入文件作为整体读入内存。
ed -s text.txt <<'EOF'
1i
line 1
line 2
.
w
EOF
-s
屏蔽了ed
的状态讯息。ed
)提供给<<'EOF' ... EOF
,即通过 stdin 。1i
使1
(第1行)成为当前行并开始插入模式(i
)。.
终止。w
将结果写回输入文件(用于测试,将w
替换为,p
以仅打印结果,而不修改输入文件)。答案 10 :(得分:3)
使用sed
的另一种方式:
sed -i.old '1 {i to be prepended
}' inFile
如果要预先添加的行是多行:
sed -i.old '1 {i\
to be prepended\
multiline
}' inFile
答案 11 :(得分:2)
另一个相当直接的解决方案是:
$ echo -e "string\n" $(cat file)
答案 12 :(得分:1)
如果您喜欢vi / vim,这可能更符合您的风格。
printf '0i\n%s\n.\nwq\n' prepend-text | ed file
答案 13 :(得分:1)
通过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
没有中间文件,只有bash / echo。
答案 14 :(得分:0)
# 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
答案 15 :(得分:0)
我真的不喜欢这里的任何答案,所以我建立了自己的命令:pre
。
使用go:
安装 go get -u github.com/Flaque/pre
将stdin中的一些文本预先添加到文件中:
echo "some at the start" | pre myFile.txt | sponge myFile.txt
命令没有写到位,它只是输出到stdout,所以你需要来自sponge
的{{1}}来保存文件。
答案 16 :(得分:0)
我建议定义一个函数,然后在需要的地方导入并使用它。
prepend_to_file() {
file=$1
text=$2
if ! [[ -f $file ]] then
touch $file
fi
echo "$text" | cat - $file > $file.new
mv -f $file.new $file
}
然后像这样使用它:
prepend_to_file test.txt "This is first"
prepend_to_file test.txt "This is second"
您的文件内容将为:
This is second
This is first
我将使用这种方法来实现变更日志更新程序。
答案 17 :(得分:0)
你可以用 awk 轻松做到这一点
cat text.txt|awk '{print "to be prepended"$0}'
答案 18 :(得分:0)
对于想要附加一行或多行文本(带有变量甚至子shell代码)并保持可读性和格式的未来读者,您可能会喜欢这个:
echo "Lonely string" > my-file.txt
然后运行
cat <<EOF > my-file.txt
Hello, there!
$(cat my-file.txt)
EOF
cat my-file.txt
的结果:
Hello, there!
Lonely string
这是有效的,因为 my-file.txt
的读取首先发生在子 shell 中。我一直使用这个技巧将重要规则附加到 Docker 容器中的配置文件,而不是复制整个配置文件。