SED用XML替换多行

时间:2014-11-03 08:29:10

标签: xml sed

我试图替换以下行

    <application-bnd>
        <security-role name="appAdmin">
            <user name="appadmin"/>
        </security-role>

        <security-role name="RestAdmin">
            <user name="appadmin"/>
        </security-role>

        <security-role name="ConsoleAdmin">
            <user name="appadmin"/>
        </security-role>

        <security-role name="ConsoleUser">
            <special-subject type="ALL_AUTHENTICATED_USERS" />
        </security-role>
    </application-bnd> 

    <application-bnd>
        <security-role name="ALL_AUTHENTICATED_CONTAINER">
        <special-subject type="ALL_AUTHENTICATED_USERS"/>
        </security-role>
    </application-bnd> 
使用sed命令。

  1. application-bnd元素是big xml的一部分,我只是想找到具有上述功能的多行,然后替换它。
  2. 安全角色元素的数量不固定。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你可以尝试这个解决方案,但是我从你的文件中删除了新行,所以如果你不想删除换行符,或者你在application-bnd之后有安全角色,那么这将不起作用

cat text.xml | tr -d '\n' | sed 's%<security-role.*<security-role%<security-role name="ALL_AUTHENTICATED_CONTAINER"><security-role%'

答案 1 :(得分:0)

这里有一个awk而不是sed的解决方案,可以完成你的工作

awk '
BEGIN { 
  enable=0; 
  lineToRemove == 0;
}
/<application-bnd/ { 
  replacementStart=1; 
}
/<\/application-bnd/ {
  replacementStart=0; enable=0;
}
/<security-role/ {
  if (replacementStart==1) enable=1;
}
/<\/security-role/ {
  if (replacementStart==1) enable=0; lineToRemove = 1; }
/ALL_AUTHENTICATED_USERS/ {
  print "<security-role name=\"ALL_AUTHENTICATED_CONTAINER\">";
  print "<special-subject type=\"ALL_AUTHENTICATED_USERS\"/>";
  print "</security-role>";
}
/.*/ { 
  if (enable==0 && lineToRemove == 0) print $0;
  lineToRemove = 0;
}' text.xml