根据常见字符串的出现重新索引两位数字字符串

Re-index two digit strings based on occurrence of a common string

我有一个 urlwatch .yaml 格式的文件:

name: 01_urlwatch update released
url: "https://github.com/thp/urlwatch/releases"
filter:
  - xpath:
      path: '(//div[contains(@class,"release-timeline-tags")]//h4)[1]/a'
  - html2text: re
---
name: 02_urlwatch webpage
url: "https://thp.io/2008/urlwatch/"
filter: 
  - html2text: re
  - grep: (?i)current\sversion  #\s Matches a whitespace character
  - strip # Strip leading and trailing whitespace 
---
name: 04_RansomWhere? Objective-See
url: "https://objective-see.com/products/ransomwhere.html"
filter:
  - html2text: re
  - grep: (?i)current\sversion #\s Matches a whitespace character
  - strip #Strip leading and trailing whitespace
---
name: 05_BlockBLock Objective-See
url: "https://objective-see.com/products/blockblock.html"
filter:
  - html2text: re
  - grep: (?i)current\sversion #(?i) \s 
  - strip #Strip leading and trailing whitespace
---

我需要根据 name: 的出现“重新索引”两位数。在此示例中,第一次和第二次出现的 name: 后跟正确的索引号,但第三次和第四次不是。

在上面的示例中,第三次和第四次出现的 name: 将重新索引其索引号,以便在文本字符串之前添加 03_04_。即:一个两位数的索引号,一个下划线。

此外,此字符串的某些实例 #name: 不应计算在重新索引中。 (它们已被注释掉,因此 urlwatch 不会对这些行采取行动)

我尝试使用 sed 但无法根据字符串的出现生成索引号。我没有 GNU sed,但如果这是唯一的方法,我可以安装。

我觉得这样可以,

awk '/^name: / { sub(/[0-9]{2}/, ++i); sub(/ [1-9][^0-9]/,"\x0&"); sub(/\x0 /," 0") }; 1' your_input

在以 name: 开头的每一行中,我们在递增后用数字 i 替换两位数 ([0-9]{2})(它从未定义开始,即从 0 开始,所以第一次递增时得到 1);如果只有一个数字,我们用另一个替换标记该行,用第三个替换我们添加前导 0 并删除标记。

可能有点脆弱,但根据您的解释,它看起来不错。

awk '/^name/{sub(/[0-9]{2}/,sprintf("%02d", ++c))}1' file

对于任何以“name”开头的行,我们用我们的计数器替换第一个 2 位数字,计数器在每次出现时递增,在 GNU awk sprintf 函数的帮助下用前导零打印它需要的时候。

这可能适合您 (GNU sed):

sed -E '/^name:/{x;s/.*/expr & + 1/e;s/^.$/0&/;x;G;s/[0-9]+(.*)\n(.*)//}' file

在行开始 name: 上匹配,在保留 space 中递增计数器,将保留 space 附加到模式 space,匹配第一组整数并使用捕获的组代替计数器。