增加源文件中的所有定义/枚举

时间:2015-03-16 19:25:49

标签: sed enums text-editor

说我有很多(100+)定义/枚举/变量,例如:

FOO:    1
BAR:    2
QUX:    3
// ...
ZYX:   99
XYZ:  100

我想在BAZ: 3之后添加新行:BAR,并将QUX的值更新为'4',以及更新其余值。使用内置/本机unix文本编辑工具(如文本编辑器,sed等),在BAZ之后增加所有值的最有效,最简单的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

考虑这个输入文件:

$ cat file
FOO:    1
BAR:    2
QUX:    3
// ...
ZYX:   99
XYZ:  100

这会在BAR之后插入BAZ并在此之后递增每个数字:

$ awk 'NR==1,/^BAR:/{print;next} !f{print "BAZ: 3";f=1} /^[[:alnum:]]+:/{print $1,++$2;next} 1' file
FOO:    1
BAR:    2
BAZ: 3
QUX: 4
// ...
ZYX: 100
XYZ: 101

如何运作

  • NR==1,/^BAR:/{print;next}

    打印所有行,包括以BAR:开头的第一行,然后跳转到下一行

  • !f{print "BAZ: 3";f=1}

    我们只在遇到BAR后才到达此行。在这里,添加BAZ行并将标记f设置为1,以便我们知道不再添加它。

  • /^[[:alnum:]]+:/{print $1,++$2;next}

    对于以标识符后跟冒号开头的任何行号,请在冒号后面加上数字并跳到下一行。

  • 1

    对于所有其他行,例如//...,请按原样打印。 (1是awk用于打印行的神秘缩写。)

答案 1 :(得分:1)

awk似乎最简单:

awk '{ $2 += n; print } $1 == "BAR:" { n = 1; print "BAZ:", $2 + 1 }' filename

这应理解如下:

{                       # for all lines:
  $2 += n               # increase second field by remembered number
                        # (initially 0)
  print                 # print line with that change
}
$1 == "BAR:" {          # When the first field in the line was "BAR:"
  n = 1                 # set offset
  print "BAZ:", $2 + 1  # insert new line
}

我假设整个文件中只有一条BAR:行;如果无法保证,您可能需要将其修改为

awk '{ $2 += n; print } !n && $1 == "BAR:" { n = 1; print "BAZ:", $2 + 1 }' filename

仅在第一个BAZ:

之后插入BAR:
awk '{ $2 += n; print } $1 == "BAR:" { ++n; print "BAZ:", $2 + n }' filename

在每次出现BAZ:后插入BAR:行,同时保持编号完好无损。当然,这两种变体都可以使用简单的输入。

对于漂亮的格式,您可以使用sprintf内置:

awk '{ $2 = sprintf("%4d", $2 + n); print } $1 == "BAR:" { ++n; print "BAZ:", sprintf("%4d", $2 + n) }' filename

这将导致以下输出:

FOO:    1
BAR:    2
BAZ:    3
QUX:    4
...
ZYX:  100
XYZ:  101