我试图在文件中查找字符串(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