sed 使用哪些选项来解析文件并写入新文件

sed 使用哪些选项来解析文件并写入新文件

我正在调试别人编写的 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>

答案2

你可以在非常完整和易读的 GNU sed 中找到答案手册页,尤其是s命令,其中说:

s 命令的语法是“s/regexp/replacement/flags”。

/ 字符可以被任何给定命令中的任何其他单个字符统一替换s

s命令后面可以跟零个或多个以下标志:

e此命令允许将 shell 命令的输入通过管道传输到模式空间...

我们进一步

4.3 通过文本匹配选择行

\%正则表达式%

(% 可以被任何其他单个字符替换。)这也匹配正则表达式 regexp,但允许使用与 / 不同的分隔符。

相关内容