如何在特定行之前将文件内容插入到另一个文件中

use*_*200 19 sed

如何使用sed将特定行之前的文件内容插入到另一个文件中?

示例我有file1.xml具有以下内容:

        <field tagRef="376">
        </field>
        <field tagRef="377">
        </field>
        <field tagRef="58">
        </field>
        <group ref="StandardMessageTrailer" required="true"/>
    </fieldList>
</message>
Run Code Online (Sandbox Code Playgroud)

和file2.xml具有以下内容:

        <field tagRef="9647">
            <description>Offset</description>
        </field>
        <field tagRef="9648">
            <description>Offset Units/Direction</description>
        </field>
        <field tagRef="9646">
            <description>Anchor Price</description>
        </field>
Run Code Online (Sandbox Code Playgroud)

如何才能将file2的内容插入到file1中

<group ref="StandardMessageTrailer" required="true"/>
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样:

       <field tagRef="376">
        </field>
        <field tagRef="377">
        </field>
        <field tagRef="58">
        </field>
        <field tagRef="9647">
            <description>Offset</description>
        </field>
        <field tagRef="9648">
            <description>Offset Units/Direction</description>
        </field>
        <field tagRef="9646">
            <description>Anchor Price</description>
        </field>
        <group ref="StandardMessageTrailer" required="true"/>
    </fieldList>
</message>
Run Code Online (Sandbox Code Playgroud)

我知道如何使用后插入该行

sed 'group ref="StandardMessageTrailer"/r file2.xml' file1.xml > newfile.xml  
Run Code Online (Sandbox Code Playgroud)

但我想先插入它.

感谢帮助

gho*_*g74 20

f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1 
Run Code Online (Sandbox Code Playgroud)

如果你想要sed,这是一种方式

sed  -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1
Run Code Online (Sandbox Code Playgroud)

  • 你的`sed`版本不会打印file1的最后一行.如果在''x'之后添加`-e'$ G'`,那么它会,但如果带有正则表达式的行是file1中的最后一行,则打印该行*然后*file2的内容将失败. (4认同)
  • 在MacOS上,您可以通过在命令中添加-i.bak直接将更改写入文件:`sed -i.bak -e'/ StandardMessageTrailer/r file2'-e'x; $ G'file1` (2认同)