sed / awk替换第二次出现的通配符选择

时间:2014-09-03 15:59:43

标签: xml bash perl awk sed

我有一个文件..它有很多行,但相关的可能看起来像:

<name></name>
<name>LED_1</name>
<name>Action Button_8</name>
<name>Action Button_1</name>
<name>LED_1</name>
<name>Label_59</name>
<name>Label_83</name>

需要编辑这些名称以便在运行时使用索引集,而另一个我想在此处设置,最好保持其窗口小部件类型(标签,LED等)完好无损。只有3-7行/名称&gt;在任何文件中,所以我不介意更改一个内容以在包含我的文件的文件夹中单独修复每个事件。

我试过了:

sed -i 's/_.*<\/name>/_${DINDEX}_1<\/name>/2'

但我认为它正在寻找替换每行中的第二个匹配项,而不是文件中的第二个匹配项。 任何和所有的帮助表示赞赏!谢谢!

编辑: 期望的结果

<name></name>
<name>LED_${DINDEX}_1</name>
<name>Action Button_${DINDEX}_2</name>
<name>Action Button_${DINDEX}_3</name>
<name>LED_${DINDEX}_4</name>
<name>Label_${DINDEX}_5</name>
<name>Label_${DINDEX}_6</name>

2 个答案:

答案 0 :(得分:1)

使用awk你可以这样做:

awk '/<name>[^_]*_/ {sub(/_[^<]*/, "_${DINDEX}_" ++i)} 1' file
<name></name>
<name>LED_${DINDEX}_1</name>
<name>Action Button_${DINDEX}_2</name>
<name>Action Button_${DINDEX}_3</name>
<name>LED_${DINDEX}_4</name>
<name>Label_${DINDEX}_5</name>
<name>Label_${DINDEX}_6</name>

答案 1 :(得分:0)

@Daniel Crisp:在命令提示符下使用perl one liner获得相同的所需输出:

perl -lpe "$n;s/_[^<]*/_\${DINDEX}_$n/;$n=$n+1" inputfile