将文本从一个文件插入另一个文件的开头-bash
我试图在一些源文件的开头插入一些复制正确的信息。我知道以以下方式使用sed:将文本从一个文件插入另一个文件的开头-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 "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
-在文件(sample.txt)的第一行保存它以保留空间1{h;
-读取头文件(header.txt)rheader.txt
-从模式空间中删除文件的原始第一行,并结束第1行的处理-在此处删除它可防止在文件开头插入额外的空行d}
- 现在输出头文件内容
-读取文件(sample.txt)的第2行时,将其交换到保持空间,并将保持空间(包含原始第1行)交换到模式空间2{x;
-在模式空间(现在包含原始的第1行和第2行)的末尾追加保持空间,并完成第2行的处理G}
- 现在输出第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
循环。