【发布时间】:2021-07-27 06:58:48
【问题描述】:
我想使用从 source.xml 中提取的值替换 target.xml 中 <value>{Change_me}</value> 中的字符串 {Change_me}
- 以下是我的文件
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 未知 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>
【问题讨论】:
-
请显示
ksh -x change.ksh的输出,无论是好的情况还是坏的情况。解释你的算法也可能会有所帮助。我是否正确理解您正在尝试提取<value>和</value>之间的字符串并构造一个sed命令,该命令将用{Change_me}完全替换该字符串?文件source.xml是否完整或您的真实文件是否包含更多数据?在后一种情况下,显示一个更好地代表您的真实输入的示例。请edit回答您的问题。 -
我认为
ksh -x输出仅显示坏情况。最好也有好的案例来比较 -
嗨,Bodo,糟糕的情况在帖子中,我的主要目标是我想替换源 target.xml 中存在的
<value>{Change_me}</value>的标签内的字符串{Change_me}。 xml 是我替换 {Change_me} 的输入变量,因为您注意到每个名称都有一个分配的值,这就是为什么我使用 grep -A1 根据名称分配适当的值,就像从源复制适当的密码一样。 xml 到 target.xml。我希望我的解释很清楚,稍后会发布好的案例,以便我们更好地理解预期的输出。非常感谢。 -
您好 Bodo,我在帖子中添加了好案例,因为无法在评论中添加,非常感谢。
-
Do not parse xml with regex。是否要将
<name>{this}与 source.xml 和 target.xml 文件之间的匹配进行匹配?或者您是否只想将 target.xml 中的第一个 {change} 替换为 source.xml 文件中的第一个,第二个替换为第二个等?。
标签: shell unix ksh solaris-10