ElasticSearch快照恢复模块正则重命名需求咨询:寻求简洁的预查正则替代实现方案
绝对可以用更简洁的正则搞定这个需求!你之前的sed写法确实有点繁琐,我给你两种更优雅的方案,都能完美匹配你的索引重命名场景:
方案1:非贪婪量词(最简洁)
针对ElasticSearch的快照重命名配置,直接用这个正则就能实现需求:
rename_pattern: ^foo_(.*?)(_bar)?$ rename_replacement: $1
对应的简化版sed测试命令如下,执行后完全符合你的预期:
echo foo_some_string | sed -nE 's/^foo_(.*?)(_bar)?$/\1/p' # 输出:some_string echo foo_some_string_bar | sed -nE 's/^foo_(.*?)(_bar)?$/\1/p' # 输出:some_string echo foo_some_string_bar_bar | sed -nE 's/^foo_(.*?)(_bar)?$/\1/p' # 输出:some_string_bar
原理说明
^foo_:精准匹配开头的固定前缀(.*?):非贪婪捕获任意字符,它会尽可能少地匹配内容,直到遇到后面可选的_bar(如果存在)(_bar)?:可选匹配末尾的_bar后缀,一旦匹配到就会被忽略(因为我们只保留前面捕获的$1)
方案2:正向预查(另一种思路)
如果你更偏好预查语法,也可以用这个写法:
rename_pattern: ^foo_(.*)(?=_bar$)|^foo_(.*)$ rename_replacement: $1$2
对应的sed测试命令:
echo foo_some_string | sed -nE 's/^foo_(.*)(?=_bar$)|^foo_(.*)$/\1\2/p'
原理说明
- 第一个分支
^foo_(.*)(?=_bar$):匹配以_bar结尾的字符串,捕获_bar之前的内容 - 第二个分支
^foo_(.*)$:匹配不以_bar结尾的字符串,捕获全部内容 - 替换时合并两个捕获组的结果,同样能达到预期效果
补充:为什么你最初的正则没生效?
你一开始尝试的^foo_(.+)(_bar)?$用了贪婪量词+,会把foo_后面的所有内容(包括末尾的_bar)都捕获到$1里,所以替换后无法去掉目标后缀,这也是你需要复杂sed命令的原因。
内容的提问来源于stack exchange,提问作者Rihad
相关产品推荐
相关产品推荐

