为 solaris 10 UNIX 命令替换 `<value> REPLACE ANY STRING</value>` 中的字符串

问题描述

我想使用从 source.xml 中提取的值替换 target.xml 中 <value>{Change_me}</value> 中的字符串 {Change_me}

  1. 以下是我的文件
source.xml
    <name>App1</name>
    <value>#!@+aw13dawe=</value>
    <name>App2</name>
    <value>=313ak#a!@BAd</value>
    <name>App3</name>
    <value>!23aaB8=l6</value>
    <name>App4</name>
    <value>0913@aa!#=</value>

target.xml
    <name>App1</name>
    <value>{Change_me}</value>
    <name>App2</name>
    <value>{Change_me}</value>
    <name>App3</name>
    <value>{Change_me}</value>
    <name>App4</name>
    <value>{Change_me}</value>

    forloop file list.txt
    App1
    App2
    App3
    App4

script1(低于 sed 在 linux 系统中有效,但在 SunOS unknown 5.10 Generic_147148-26 中无效 i86pc i386 i86pc)

    #!/bin/ksh
    a={Change_me}

    for i in $(cat list.txt) ;
        do sed -i.bak "0,/$a/s//$(grep $i source.xml -A1 | grep value | grep -oP '(?<=value>).*?(?=</value>)')/" target.xml;
    done

我在 Solaris 中编写的 Script2 遇到了问题。

    #!/bin/ksh
    a={Change_me}

    for i in $(cat list.txt) ;
        do sed -e "0,/"$a"/s//"$(/usr/sfw/bin/ggrep $i -A1 source.xml | grep value | sed -e 's/.*<value>\(.*\)<\/value>.*/\1/')"" target.xml ;
    done

结果:

# ksh -x change.ksh
/bin/pwd
2> /dev/null
PWD=/scripts/middleware
+ a={Change_me}
+ cat list.txt
+ /usr/sfw/bin/ggrep App1 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//#!@+aw13dawe= target.xml
sed: command garbled: 0,/{Change_me}/s//#!@+aw13dawe=
+ /usr/sfw/bin/ggrep App2 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//=313ak#a!@BAd target.xml
sed: command garbled: 0,/{Change_me}/s//=313ak#a!@BAd
+ /usr/sfw/bin/ggrep App3 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//!23aaB8=l6 target.xml
sed: command garbled: 0,/{Change_me}/s//!23aaB8=l6
+ /usr/sfw/bin/ggrep App4 -A1 source.xml
+ grep value
+ sed -e s/.*<value>\(.*\)<\/value>.*/\1/
+ sed -e 0,/{Change_me}/s//0913@aa!#= target.xml
sed: command garbled: 0,/{Change_me}/s//0913@aa!#=

sed -i 在 solaris 中不起作用,这就是我使用 sed -e 的原因,但如结果所示,它没有按预期工作,非常感谢您的帮助和建议。

这是好的案例输出注意:仅适用于 Linux (RHEL 7 - testmachine)

[root@vmserver1 ~]# bash -x change.sh
+ a='{Change_me}'
++ cat list.txt
+ for i in '$(cat list.txt)'
++ grep App1 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//#!@+aw13dawe=/' target.xml
+ for i in '$(cat list.txt)'
++ grep App2 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//=313ak#a!@BAd/' target.xml
+ for i in '$(cat list.txt)'
++ grep App3 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//!23aaB8=l6/' target.xml
+ for i in '$(cat list.txt)'
++ grep App4 source.xml -A1
++ grep value
++ grep -oP '(?<=value>).*?(?=</value>)'
+ sed -i.bak '0,/{Change_me}/s//0913@aa!#=/' target.xml
[root@vmserver1 ~]#

target.xml 的好结果

[root@vmserver1 ~]# cat target.xml
<name>App1</name>
<value>#!@+aw13dawe=</value>
<name>App2</name>
<value>=313ak#a!@BAd</value>
<name>App3</name>
<value>!23aaB8=l6</value>
<name>App4</name>
<value>0913@aa!#=</value>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)