我尝试用changes.xml的整个内容替换file_to_change.xml中的一个文本块,这是主文件的一个标记,有一个小的更改。
以下是file_to_change.xml的内容:
<clients>
<client>
<name>Bob</name>
<age>18</age>
</client>
<client>
<name>Alice</name>
<age>12</age>
</client>
<client>
<name>Carlos</name>
<age>28</age>
</client>
</clients>
下面是changes.xml的内容:
<client>
<name>Carlita</name>
<age>17</age>
</client>
这是一个辅助文件的内容,其中包含了我想要更改的行:
<client>
<name>Carlos</name>
<age>28</age>
</client>
我所寻找的解决方案与here所解释的解决方案之间最大的区别在于文件并不完全相同,同样重要的是,我所工作的环境不允许我使用外部工具,因此我试图找到一个“核心”解决方案,使用sed、awk等。
这是我试图使用的命令:
sed -i -e '1r changes.xml' -e '1,/r aux.xml/d' file_to_change.xml
我希望file_to_change. xml看起来像这样:
<clients>
<client>
<name>Bob</name>
<age>18</age>
</client>
<client>
<name>Alice</name>
<age>12</age>
</client>
<client>
<name>Carlita</name>
<age>17</age>
</client>
</clients>
3条答案
按热度按时间rpppsulh1#
用纯重击?
ercv8c1e2#
我将按照以下方式利用GNU
AWK
完成此任务,让file.txt
内容和
file_detect.txt
是和
file_replacement.txt
是那么
给出输出
RS
改变为不存在于所涉及的任何文件中的任何值。说明:首先我告诉GNU
AWK
,空行被认为是行分隔符,使用RS
设置为空字符串,目的是让GNUAWK
认为整个文件是一个大的单行。然后当我遇到名为file_replacement.txt
的文件时,我简单地将其内容存储到名为repl
的变量中,并指示GNUAWK
转到next
行。因此不执行其他操作,类似地,file_detect.txt
内容存储在名为find
的变量中。然后,我按照以下方式使用String functions:首先,index
检测要替换的部分位于何处,然后使用substr
获取要替换的部分之前的部分substr($0,1,place-1)
和要替换的部分之后的部分substr($0,place+length(find)
,然后使用repl
将它们连接起来。file.txt
内正好有一个file_detect.txt
。iugsix8n3#
这可能对您有用(GNU sed):