我有一个关于使用sed修改文件的问题。我的文件内容:
<data-value name="WLS_INSTALL_DIR" value="/home/Oracle/wlserver_10.3">
我想替换字段value="/home/Oracle/wlserver_10.3"
得到这个结果:
<data-value name="WLS_INSTALL_DIR" value="/u03/Middle_home/Oracle/wlserver_10.3">
我使用sed
:
sed "6 i/^value=/>/s/value= />\(.*\)/value=\"\/u03\/Oracle/Middleware/wlserver_10.3"\" \/\ /u03/silent.xml
答案 0 :(得分:0)
尝试:
sed 's|/home|/u03/Middle_home|'
答案 1 :(得分:0)
您的sed
脚本存在许多问题。
首先,任何看起来像6istuff
的东西都会简单地将i
(“插入”)之后的所有内容写成第六行之前的新行。 (有些方言在i
之后需要换行,基本上什么都不做。)
其次,^value=
与您的输入不符;它只会选择以字符串value=
开头的行(^
元字符表示行的开头)。
第三,你的替代正则表达式中的/>
终止了替换,因此从>
开始的所有内容都被解析为替换的无效标志。无论如何,我看不出这部分的目的;它与您的数据不匹配,因此正则表达式失败。
删除所有这些多余和错误的细节后剩下的是一个或多或少有用的sed
脚本。 (我假设只有第六行输入的6
是故意的,尽管你根本没有在问题中提到这一点。)我做了一些额外的小改进,比如使用%
作为替换分隔符并收紧正则表达式,以便它只能替换双引号值。
sed '6s%value="[^"]*"%value="/u03/Oracle/Middleware/wlserver_10.3"%' /u03/silent.xml
优于6
可能是使用/name="WLS_INSTALL_DIR"/
确定行。
然而,正如评论中所提到的,操纵XML的正确方法是使用专用工具,例如xsltproc
。