Awk 根据公共字符串的出现情况重新索引两位数字符串

Awk 根据公共字符串的出现情况重新索引两位数字符串,awk,sed,grep,gnu-sed,Awk,Sed,Grep,Gnu Sed,我有一个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: 0

我有一个
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:
会将其索引号重新编入索引,使
03_
04_
位于文本字符串之前。即:一个两位数的索引号和一个下划线

此外,此字符串的一些实例
#name:
,不应计入重新索引中。(它们已被注释掉,因此
urlwatch
不会对这些行执行操作)


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

我认为这可以

awk'/^name:/{sub(/[0-9]{2}/,++i);sub(/[1-9][^0-9]/,“\x0&”);sub(/\x0/,“0”);1'您的输入
在以
name:
开头的每一行上,我们将两位数(
[0-9]{2}
)在递增后替换为一个数字
i
(它从未定义开始,即从0开始,因此我们第一次递增它时得到1);如果只有一位数字,我们用另一个替换来标记行,用第三个替换来添加前导0并删除标记

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

awk'/^name/{sub(/[0-9]{2}/,sprintf(“%02d”,++c))}1'文件
对于任何以“name”开头的行,我们用计数器替换前两位数字,每次出现时计数器都会递增,在GNU awk函数的帮助下,在需要时用前导零打印出来。

这可能适用于您(GNU-sed):


匹配以
名称:
开头的行,在保留空间中增加一个计数器,将保留空间附加到模式空间,匹配第一组整数,并使用捕获的组替换计数器。

不要使用
sed
。我相信,这可以在awk脚本中完成-匹配表达式,用新的数字、输出替换为
gsub
。如果你在macOS上,无论如何都要安装GNU-sed和GNU-awk,否则你会失去许多使用其破坏的默认值的功能(由mac用户确认)<正如卡米尔已经说过的那样,code>sed也不适合这份工作。对不起,那是我的错误。它做的正是它应该做的!美好的另外,在将来考虑使用GNU AWK和GNU-SED,以防您的操作系统都有它们,我想您可以安装它们。谢谢。比我能处理的更高级更复杂。我将安装与自制<代码>brew安装gnu sed;brew安装gnu awk我只需要一个两位数的索引号。我就是这么问的。您编写的命令在10之后跳到一个三位数,然后每隔十个数字之间跳:01、02、03、04、05、06、07、08、09、10、101、102、103、104、105、106、107、108、109、20、201、202、203、204、205、206、207、208、209、30,。。。。谢谢你的帮助。@John,我想现在已经修好了,fwiw。我确实在这个问题上投了几票赞成票。我猜是有人来投票否决了我。我认为这对于一个新手CLI用户来说并不简单。否决票无处不在,即使是在最好的问题上。但是,我的修复现在可以工作了吗?
sed -E '/^name:/{x;s/.*/expr & + 1/e;s/^.$/0&/;x;G;s/[0-9]+(.*)\n(.*)/\2\1/}' file