我有2个文件:
idfile.txt
:
1111
3333
replace.xml
:
<condition="online" id="1111" >
<condition="online" id="2222" >
<condition="online" id="3333" >
<condition="online" id="4444" >
我需要一个脚本才能低于output.xml
:
<condition="offline" id="1111" >
<condition="online" id="2222" >
<condition="offline" id="3333" >
<condition="online" id="4444" >
我用:
while read line; do
grep $line replace.xml | sed 's/condition="online"/condition="offline"/g' replace.xml >> output.xml
done < idfile.txt
我的脚本会替换condition="online"
中的所有condition="offline"
。
非常感谢!
答案 0 :(得分:1)
注意,来自id
的{{1}}属性值应与replace.xml
中符合条件的任何条目匹配。
awk + 粘贴解决方案:
idfile.txt
输出:
awk -v ids="$(paste -s -d'|' idfile.txt)" 'match($2,ids){ sub("online","offline",$1) }1' replace.xml
答案 1 :(得分:0)
如果您的文件很大,我会使用awk
。请注意,您的idfile.txt
应为:
1111
3333
获得有趣的东西。
我就是这样做的awk
:
#!/bin/bash
awk '
BEGIN {
while( (getline $l < "idfile.txt") > 0 ) {
if( $l ~ /^.+$/ ) {
id[$l] = 1;
}
}
close("idfile.txt");
}
/^.+$/ {
split($2, a, "\"");
if( id[ a[2] ] ) {
printf "<condition=\"online\" id=\"%s\">\n", a[2];
}
else {
printf "<condition=\"offline\" id=\"%s\">\n", a[2];
}
}
' replace.xml >output.xml
BEGIN
块将id文件读取到id
数组。 awk
使用哈希来实现查找,因此它们很有效。正则表达式/^.+$/
旨在避免处理空行。该代码旨在包含在bash
(文本)文件中。
$2
会得到id="nnnn">
个部分,而split
将会在数组a[2]
中获得引号中的部分内容。
答案 2 :(得分:0)
awk 一个班轮
$ awk 'FNR==NR{a[$0]; next} ($4 in a){gsub(/online/,"offline")}1' idfile.txt FS='"' replace.xml
First
:将所有ID存储在a
中
Next
,在遍历replace.xml时,如果数组$4
中存在id a
,则将online
替换为offline
。注意:字段分隔符为"
for replace.xml
输出
<condition="offline" id="1111" >
<condition="online" id="2222" >
<condition="offline" id="3333" >
<condition="online" id="4444" >