Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文本从一个文件插入另一个文件的开头-bash_Bash_Insert_Sed - Fatal编程技术网

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

将文本从一个文件插入另一个文件的开头-bash,bash,insert,sed,Bash,Insert,Sed,我试图在一些源文件的开头插入一些复制正确的信息。我知道以以下方式使用sed: sed "1iSome copyrighted information." sample.txt 将在sample.txt的开头插入文本“某些受版权保护的信息”。 我需要将文件中的文本插入sample.txt的开头。在sed中是否有任何方法可以使用cat命令实现上述目的,比如说以下内容 sed "1i{cat header.txt}" sample.txt 我在谷歌上搜索了上述内容,但没有找到我一直在寻找的确切内容

我试图在一些源文件的开头插入一些复制正确的信息。我知道以以下方式使用sed:

sed "1iSome copyrighted information." sample.txt
将在sample.txt的开头插入文本“某些受版权保护的信息”。
我需要将文件中的文本插入sample.txt的开头。在sed中是否有任何方法可以使用
cat
命令实现上述目的,比如说以下内容

sed "1i{cat header.txt}" sample.txt
我在谷歌上搜索了上述内容,但没有找到我一直在寻找的确切内容。欢迎在这方面提供任何帮助


谢谢。

如果您真的想使用
sed

cat header.txt sample.txt > temp.txt
mv temp.txt sample.txt
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
sed -i -e '2{x;G};1{h;rheader.txt' -e 'd}' sample.txt

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

为什么不反过来做呢,例如,将源文件附加到版权文件中

“cat”命令实际上是“concatenate”的缩写,您可以简单地说

for f in *.c
do
    cp $f /tmp
    cat copyright.txt /tmp/$f >$f
done
使用ed文本编辑器:

echo -e '0r header.txt\nw' | ed sample.txt
或使用vi/ex命令:

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

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

如果您有GNU
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
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;
    -读取文件(sample.txt)的第2行时,将其交换到保持空间,并将保持空间(包含原始第1行)交换到模式空间
  • G}
    -在模式空间(现在包含原始的第1行和第2行)的末尾追加保持空间,并完成第2行的处理
  • 现在输出第1行和第2行,然后继续处理文件的其余部分,这包括简单地读取和输出每一行

编辑:我从最初发布的版本中删除了一个多余的命令。

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

echo "$(cat header.txt sample.txt)" > sample.txt
请注意引号(
)以保留行尾,以及
cat
连接在子进程中运行的事实-因此不应覆盖打开以供读取的文件(sample.txt)


干杯!

这将把标题放在samples下面。这将把sampte.txt附加到header.txt。顺序是正确的。在你的评论之后,我又尝试了一次。效果很好。你可以在一行中完成此操作…”cat header.txt sample.txt>temp.txt&&mv temp.txt sample.txt" ... 一旦您使用过它,就可以理解了。您在/tmp中遇到了一个主要的清理问题-这假设您首先没有在/tmp中工作!不是真的,这就是/tmp的作用。如果您满意,只需将其rm,如果您不满意,您已保证可以撤消更改。我认为,如果您的头包含一些sed解释为命令的字符串,则此方法将不起作用。tangens是正确的,这不起作用。header.txt包含C样式注释(/*和*/)形式的信息,sed将其解释为一个命令。您如何[根据条件]递归地将其应用于文件夹中的所有文件?e、 g:
用于中的所有子文件夹/文件:如果文件为*.c,则SED_CMD
@bny:One-way(对于bash4):
shopt-s globstar;在./***/.c中存档;执行[[-f$file]]&&SED_CMD;完成
。您可以使用
“$file”作为sed
的文件名参数。例如,如果您使用的是Bash的早期版本,则可以使用
find`和
xargs
而不是
for
循环。