Unix命令将文本添加到文件中

时间:2012-05-14 16:45:52

标签: unix command-line utilities prepend

是否有Unix命令将一些字符串数据添加到文本文件中?

类似的东西:

prepend "to be prepended" text.txt

19 个答案:

答案 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

使用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的状态讯息。
  • 请注意命令如何作为多行here-documented)提供给<<'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 容器中的配置文件,而不是复制整个配置文件。