编辑匹配某个单词的唯一行

时间:2017-09-08 17:00:59

标签: linux shell awk

我必须在文件中搜索包含某些特定单词的行,然后按如下方式编辑这些行。其他行应保持不变。 例如:

    eltu r21, r24, r23
    brz r21, outer_end
    add r27, r0, r25
    jp outer_end
    add r27, r0, r22
   outer_end:

修改为:

    eltu r21, r24, r23
line2:  brz r21, $(outer_end-line2)
    add r27, r0, r25
line4:  jp $(outer_end-line4-4)
    add r27, r0, r22
outer_end:

任何人都可以帮助您使用AWK来实现这一目标。

此致

2 个答案:

答案 0 :(得分:0)

假设那些前导“ line#:”是说明输出应该在哪里而不是实际数据,这里是一个两个调用pod install方法:

sed

输出:

 sed '/brz\|jp/{=;s/[^ ]*$/\$\(&-line/}' input_file.asm | 
 sed -n '/^[0-9]$/{h;n;G;s/\n//;s/$/\)/};p'

注意: eltu r21, r24, r23 brz r21, $(outer_end-line2) add r27, r0, r25 jp $(outer_end-line4) add r27, r0, r22 outer_end: 在这里很笨,因为sed会立即打印行号,这太早了。因此需要 2nd =来重新排列它所属的行号。

答案 1 :(得分:0)

awk 解决方案:

$ cat tst.awk
/brz|jp/{ 
   last=$NF;
   NF--;
   printf("line%s:\t%s $(%s-line%s)\n", NR, $0, last, NR); next }
NF>1{ print $0; next }
{ print $1 }

<强>解释

brzjp匹配时,保存last中的最后一个字段,删除带有NF--的最后一个字段,然后打印结果行。

如果它是包含多个字段NF>1的行,则只需打印它。 最后一种可能性是标签行,只需要打印第一个字段。

行动

awk -f tst.awk input.txt
    eltu r21, r24, r23
line2:  brz r21, $(outer_end-line2)
    add r27, r0, r25
line4:  jp $(outer_end-line4)
    add r27, r0, r22
outer_end: