说我有很多(100+)定义/枚举/变量,例如:
FOO: 1
BAR: 2
QUX: 3
// ...
ZYX: 99
XYZ: 100
我想在BAZ: 3
之后添加新行:BAR
,并将QUX
的值更新为'4',以及更新其余值。使用内置/本机unix文本编辑工具(如文本编辑器,sed等),在BAZ
之后增加所有值的最有效,最简单的解决方案是什么?
答案 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 '{ $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