在连续行中查找匹配文本并在下一行中增加数值

在连续行中查找匹配文本并在下一行中增加数值

我试图在文件中查找字符串(Name2)并匹配下一行中的版本(*abc-xyz-0-197),并使用递增的值更新 ID 行。

如何才能做到这一点?

该文件如下所示:

  Name1:
    version: *abc-xyz-0-197
    ID: 1
    primary_data: 
    somedata:
      

  Name2:
    version: *abc-xyz-0-196
    ID: 3
    primary_data: 
    somedata:

  Name3:
    version: *abc-xyz-0-192
    ID: 6
    primary_data: 
    somedata:

输出必须是:(名称2和版本:*abc-xyz-0-196)

  Name1:
    version: *abc-xyz-0-197
    ID: 1
    primary_data: 
    somedata:
      

  Name2:
    version: *abc-xyz-0-196
    ID: **4**
    primary_data: 
    somedata:

  Name3:
    version: *abc-xyz-0-192
    ID: 6
    primary_data: 
    somedata:

答案1

使用awk并设置RS=为空字符串以启用输入文件的段落模式处理:

awk -v RS= -F'\n' '$1 ~ /^ *Name2:$/ && $2 ~ /^ *version: \*abc-xyz-0-196$/ {
    bakline=$0; sub(/.*ID:/,""); newId=$0+1; 
    $0=bakline"\n"; sub(/ID: [0-9]+/,"ID: " newId);
}1' infile

检查第一行和第二行是否符合我们的要求;从匹配的块中备份,删除所有内容ID:并增加剩余的有效字符串,从备份变量返回块,然后用 newId 值替换 ID。

答案2

您可以在此处使用范围运算符,来选择所需的数据点,然后进行更改。

awk '$1=="Name2:",(!NF) {
  if ($2=="*abc-xyz-0-196") f++
  if ($1 == "ID:" && f) sub(/[0-9]+/, $2+1)
  if (!NF) f=0
}1' file

答案3

perl -00pe 's/Name2:\s*version: \*abc-xyz-0-196\s*ID: \K(\d+)/$1+1/e' ex

在哪里:

  • perl -00pe ...--> 对于每个输入段落执行...并打印
  • s/.../exp/e--> 替换...为结果eval exp
  • /...1\K...2/--> 取...1左上下文,总线替代...2

相关内容