假设你有一个像
<root>
<bean:write name='iframesrcUrl'/>
<bean:write name="iframesrcUrl"/>
<bean:write name="currentPage" property="title" filter="false"/>
<foo><bar/></foo>
</root>
您可以使用此命令进行替换sed
(使用 GNU sed):
sed "s/<bean:write name=[\'\"]\?iframesrcUrl[\'\"]\?\/>/\${ iframesrcUrl }/g; \
s/<bean:write name=[\'\"]\?currentPage[\'\"]\?.*\/>/\${ currentPage.title }/g;" \
input.xml
产生:
<root>
${ iframesrcUrl }
${ iframesrcUrl }
${ currentPage.title }
<foo><bar/></foo>
</root>
这是你需要的吗?或者你想替换属性的值?或者您想将替换文本放入这些标签中吗?
要在原地查找和编辑所有文件(注意!更改您的文件,请-i
在使用前进行测试,使用您的文件掩码而不是 '*.jsp'):
find . -type f -name '*.jsp' -print0 | xargs -0 sed -i "..."
更新
要替换属性值,而不是文件本身的行,我强烈建议使用xmlstarlet
而不是sed
/ awk
。它更加可靠和灵活。我不能完全针对您的情况发布解决方案,因为xmlstarlet
需要一个完整(有效)的文件来处理,但这是一个想法:
给定一个文件:
<a>
<b>
<c name="foo"/>
<c name="bar"/>
</b>
</a>
假设我们要替换foo
为SPAM
和。然后此命令将执行此操作(为了便于阅读而拆分行):bar
EGGS
$ printf '<a><b><c name="foo"/><c name="bar"/></b></a>' | \
xmlstarlet ed --update "//c[@name='foo']/@name" -v SPAM \
--update "//c[@name='bar']/@name" -v EGGS
<?xml version="1.0"?>
<a>
<b>
<c name="SPAM"/>
<c name="EGGS"/>
</b>
</a>
我使用 XPath 语法来选择要替换的元素(在第一种情况下,它是name
属于任何c
标记的属性,并且等于foo
)。ed
的子命令xmlstarlet
允许各种转换,替换(更新)元素就在其中。
在现实生活中的示例中,您还需要指定bean
工作区,即添加类似
-N bean=urn:...
xmlstarlet
的选项列表。您可以在 .jsp 文件的第一行中找到正确的 URI(我没有任何可查看的内容)。