Linux脚本中sed命令参数及逻辑解析问询
Linux脚本中sed命令参数及逻辑解析问询
嗨,我来帮你拆解这条sed命令的细节,你的初步理解方向是对的,但咱们可以把每个参数和逻辑拆解得更清楚:
首先先把这条命令完整贴出来方便对照:
sed -i "\#</resources>#{h;s#.*#cat /opt/abc/new.xml#e;G}" /opt/abc/tempmodule.xml
核心参数与符号解析
-i选项:这是sed的「原地编辑」参数,意思是直接修改目标文件(也就是/opt/abc/tempmodule.xml),不用手动把输出重定向到新文件,省了额外的步骤。#的特殊作用:你之前疑惑的#在这里不是注释!默认sed用/作为匹配和替换的分隔符,但咱们要匹配的字符串</resources>本身就包含/,如果还用/当分隔符,就得写成\/<\/resources>\/,既麻烦又难读。所以sed允许用任意非字母数字的字符当分隔符,这里选了#,这样匹配的内容里的/就不用转义了,可读性直接拉满。
括号内脚本的执行逻辑(h;s#.*#cat /opt/abc/new.xml#e;G)
这部分是sed的核心执行脚本,分三个用分号分隔的命令,会按顺序执行:
h命令:sed有两个缓存空间,一个是「模式空间」(当前正在处理的行),一个是「保留空间」(临时存东西的地方)。h就是把当前匹配到的行(也就是包含</resources>的那一行)复制到保留空间存起来,防止后面被覆盖。s#.*#cat /opt/abc/new.xml#e替换命令:s是替换标志,.*表示匹配当前行的所有内容;- 后面的
cat /opt/abc/new.xml是替换的内容,但这里加了e选项——这个选项的作用是把替换字符串当成shell命令执行,然后用命令的输出结果来替换原内容。简单说就是:把当前行的所有内容,换成new.xml文件里的全部内容。
G命令:把之前存在保留空间里的原</resources>行,追加到当前模式空间内容的后面。
整体执行流程总结
- sed遍历
tempmodule.xml的每一行,找到包含</resources>的那一行; - 先把这行存到保留空间备份;
- 将这行的内容替换成
new.xml的全部内容; - 再把备份的原
</resources>行加到新内容的末尾; - 最后通过
-i参数,直接把修改后的内容写回原文件。
简单说,这条命令的效果是:在tempmodule.xml里找到</resources>行,在它前面插入new.xml的所有内容,同时保留原来的</resources>行不动。
备注:内容来源于stack exchange,提问作者Malaiselvan
相关产品推荐
相关产品推荐

