根据常见字符串的出现重新索引两位数字字符串
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,匹配第一组整数并使用捕获的组代替计数器。
我有一个 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,匹配第一组整数并使用捕获的组代替计数器。