bash用特定索引替换文件中的字符串

时间:2017-09-28 12:31:12

标签: linux bash shell terminal

我有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"

非常感谢!

3 个答案:

答案 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存储在aNext,在遍历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" >