关于使用sed修改文件?

时间:2014-08-13 10:10:59

标签: sed

我有一个关于使用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

2 个答案:

答案 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