我正在调试别人编写的 LINUX 脚本。脚本中有一行代码,如下所示
sed -i "\#</resources>#{h;s#.*#cat /opt/abc/new.xml#e;G}" /opt/abc/tempmodule.xml
它似乎在进行一些模式匹配和替换,然后将内容从 new.xml 复制到 tempmodule.xml。但是 sed 中使用的这些选项是什么意思?可以解释一下吗?
我目前的理解是
它试图</resources>
在 tempmodule.xml 中查找文本“ ”,并用 new.xml 替换内容
我不知道#
这一行是什么意思。但是当我查看 sed 手册时,它说注释行。但我不认为这里的意思不同。
答案1
剧本
sed -i "\#</resources>#{h;s#.*#cat /opt/abc/new.xml#e;G}" /opt/abc/tempmodule.xml
也可以这样写,因此可以添加注释:
#!/usr/bin/sed -i -f
# As separator "#" is used. Using "\#" prevents the
# line being interpreted as a comment.
\#</resources>#{ # search the string "</resources>". if found execute:
h # store a copy of the buffer in the hold space.
s#.*#cat /opt/abc/new.xml#e
# substitute the whole line by "cat /opt/abc/new.xml"
# and "e" execute it in a shell. The new content of
# the line is the content of "/opt/abc/new.xml".
# This might be multiple lines now.
G # To the changed content of the buffer append the
# content of the hold space (the originally read line
# with the string "</resources>") as a new line at the
# end of the buffer.
}
该文件/opt/abc/tempmodule.xml
是输入文件。该选项-i
定义输出将转到输入文件并“就地”替换它 — 最后输入文件包含新内容。
输入文件逐行被读入 sed 的缓冲区。无论是否被更改,在命令结束时,缓冲区将被发送到输出,并通过将新行读入缓冲区重新启动循环。
该脚本通过在包含附加项目到 xml 对象“资源”末尾的(每一)行之前/opt/abc/tempmodule.xml
插入内容来更改文件。/opt/abc/new.xml
</resources>