如何在文件中的某个字符串后面插入文件内容?

如何在文件中的某个字符串后面插入文件内容?

例如我们有这个文件

cat exam.txt

I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
centos less then redhat
fedore what
my name is moon yea

我们想在属性行之后添加任何文件的内容作为 file.txt

cat file.txt

324325
5326436
3245235
646346
545
643
6436
63525
664
46454

所以我尝试以下操作:

a=` cat file `

sed -i '/propertie/a  `echo "$a"` ' exam.txt

但不起作用

有没有关于 sed/awk/perl 一个衬垫的建议,以便在特定字符串后添加文件内容?

预期产出

I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
    324325
    5326436
    3245235
    646346
    545
    643
    6436
    63525
    664
    46454
centos less then redhat
fedore what
my name is moon yea

答案1

您几乎不想将文件的完整内容存储在 Unix shell 脚本的变量中。如果您发现自己这样做,请问问自己是否还有其他解决方案。如果您自己找不到,请来这里,我们会看看:-)


$ sed '/propertie/r file.txt' exam.txt
I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
324325
5326436
3245235
646346
545
643
6436
63525
664
46454
centos less then redhat
fedore what
my name is moon yea

rin 中的 ("read") 命令采用sed文件名作为其参数,并将文件的内容插入到当前流中。

file.txt如果需要缩进添加的内容,请确保在运行之前缩进内容sed

$ sed 's/^/    /' file.txt >file-ind.txt
$ sed '/propertie/r file-ind.txt' exam.txt
I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
    324325
    5326436
    3245235
    646346
    545
    643
    6436
    63525
    664
    46454
centos less then redhat
fedore what
my name is moon yea

With ed(要求sed插入文件的缩进)。这也会对文件进行就地编辑,并用修改后的内容替换原始文件。

ed -s exam.txt <<END_ED
/propertie/r !sed 's/^/    /' file.txt
wq
END_ED

r如果命令以 为前缀,则in 命令能够ed读取外部命令的输出!。我们用它来缩进我们想要插入的数据。由于显而易见的原因,它在其他方面与sed上面的解决方案非常相似。

使用的唯一缺点ed是通常不能在非常大的文件上使用它。 sed用于编辑未确定长度的流,而ed可以编辑您可以在任何其他编辑器中打开的文档,即大小不是许多兆字节或千兆字节的文件。

相关内容