将文件从文件插入另一个文件的开头 - bash

时间:2010-09-24 06:19:51

标签: bash insert sed

我正在尝试将一些版权信息插入到某些源文件的开头。我知道以下列方式使用sed:

sed "1iSome copyrighted information." sample.txt

会将文本“一些受版权保护的信息”插入sample.txt的开头 我需要将文件中的文本插入到sample.txt的开头。在sed中有什么方法我可以使用cat命令用于上述目的,如下所示:

sed "1i{cat header.txt}" sample.txt

我已经搜索了上述内容,并没有找到我一直在寻找的内容。对此有任何帮助是最受欢迎的。

感谢。

6 个答案:

答案 0 :(得分:9)

如果你有GNU sed

sed -i -e '2{x;G};1{h;rheader.txt' -e 'd}' sample.txt

sample.txt必须至少包含两行。

即使头文件包含sed特有的字符,此方法仍然有效。

说明:

  • -i - 正确编辑文件
  • -e - 将脚本分成几部分 - 在这种情况下,必须分隔标题文件名的末尾(它也可以用换行符分隔)
  • 1{h; - 在文件的第一行(sample.txt)将其保存到容纳空间
  • rheader.txt - 读入头文件(header.txt)
  • d} - 从模式空间中删除文件的原始第一行并结束第1行的处理 - 在此处删除它可防止在文件开头插入额外的空行
  • 现在输出头文件内容
  • 2{x; - 当读取文件的第2行(sample.txt)时,将其交换到保留空间并将保持空间(包含原始行1)交换到模式空间
  • G} - 将持有空间附加到模式空间的末尾(现在包含原始行1和2)并完成第2行的处理
  • 现在输出第1行和第2行,然后继续处理文件的其余部分,其中包括简单地读取和输出每一行。

修改:我从我最初发布的版本中删除了一条多余的命令。

答案 1 :(得分:9)

很抱歉用完整个答案 - 只是为了格式化:)基本上,来自@tangens的相同答案,但没有临时文件:

echo "$(cat header.txt sample.txt)" > sample.txt

注意引号(")以保留行结尾,以及cat并置在子进程中运行的事实 - 因此不应该覆盖文件({ {1}})可以阅读..

干杯!

答案 2 :(得分:8)

使用ed文本编辑器:

echo -e '0r header.txt\nw' | ed sample.txt

或使用vi / ex命令:

vi - +'0r header.txt|wq' sample.txt

但是我没有看到任何在sed中运行命令的方法。

答案 3 :(得分:4)

cat header.txt sample.txt > temp.txt
mv temp.txt sample.txt

答案 4 :(得分:1)

如果您真的想使用sed

INFO=$(cat header.txt)  # read the contents of file headers.txt into var INFO
sed -i "1i$INFO" sample.txt # insert $INFO, use -i to change the file inplace

但我会使用基于cat的方法。

答案 5 :(得分:0)

为什么不反过来这样做,例如将源文件附加到您的版权文件?

'cat'命令实际上是'连接'的缩写,你可以简单地说

for f in *.c
do
    cp $f /tmp
    cat copyright.txt /tmp/$f >$f
done