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

标签 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 来实现这一目标。

问候

最佳答案

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:

关于linux - 编辑唯一匹配某个单词的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121386/

相关文章:

linux - 如何使用 awk 删除双引号

svn - 如何查看使用 svn :ignore recursively in an SVN repository? 设置的所有忽略模式

regex - 如何在复制 vfat 期间重命名文件

shell - 如何在模式之前和行号之后使用 sed 插入一行?

Python 网络时间戳(SO_TIMESTAMP、SO_TIMESTAMPNS、SO_TIMESTAMPING)

postgresql - Postgres 用大写字母转储特定表

c++ - 如何在 unix shell 中在后台执行命令?

unix - 在unix中,如何操作文本文件以确保第3列中的值小于第4列中的值?

java - 我如何找到 JAVA_OPTS 数据的存储位置?

linux - awk 语句的语法问题