gpt4 book ai didi

linux - 替换部分正则表达式并保留前缀/后缀

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:45 30 4
gpt4 key购买 nike

我试图使用 sed 替换文件中的一些字符串,但遇到了一个问题。

我有以下字符串:

TEMPLATE_MODULE
TEMPLATE_SOME_ERR
TEMPLATE_MORE_ERR

我想用一些字符串和所有以 TEMPLATE 开头并以 ERR 结尾的字符串替换 TEMPLATE_MODULE 一个不同的字符串,如如下:

TEMPLATE_MODULE   ---> NEW_MODULE_NAME
TEMPLATE_SOME_ERR ---> NEW_MODULE_NAME_SOME_ERR
TEMPLATE_MORE_ERR ---> NEW_MODULE_NAME_MORE_ERR

TEMPLATE_MODULE 的替换很简单:

find . -type f -print -exec sed -i "s/TEMPLATE_MODULE/NEW_MODULE_NAME/g" {} +

虽然我不知道如何处理另一部分。如果我查找以 TEMPLATE_* 开头的字符串,我也会捕获 TEMPLATE_MODULE

我还想保留 SOME_ERRMORE_ERR 后缀,这样这个解决方案就不起作用了:

find . -type f -print -exec sed -i "s/TEMPLATE_.*_ERR$/NEW_MODULE_NAME/g" {} +

有什么想法吗?谢谢!

最佳答案

考虑这个示例输入

$ cat ip.txt 
foo
TEMPLATE_MODULE
TEMPLATE_SOME_ERR
TEMPLATE_MORE_ERR
TEMPLATE_SOME_ERR xyz

使用多个s命令和捕获组

$ sed -E 's/\bTEMPLATE_MODULE\b/NEW_MODULE_NAME/g; s/\bTEMPLATE\w*(_(SOME|MORE)_ERR)\b/NEW_MODULE_NAME\1/g' ip.txt 
foo
NEW_MODULE_NAME
NEW_MODULE_NAME_SOME_ERR
NEW_MODULE_NAME_MORE_ERR
NEW_MODULE_NAME_SOME_ERR xyz
  • \b 用于单词边界。 \bcat\b 将只匹配 cat 而不会匹配 scatcater
  • s/\bTEMPLATE_MODULE\b/NEW_MODULE_NAME/g 会将 TEMPLATE_MODULE 替换为 NEW_MODULE_NAME
  • s/\bTEMPLATE\w*(_(SOME|MORE)_ERR)\b/NEW_MODULE_NAME\1/g 将替换 TEMPLATE 后跟零个或多个单词以 _SOME_ERR_MORE_ERR 结尾的字符与 NEW_MODULE_NAME 和捕获的字符串
  • 解决方案适用于 GNU sed,不确定与其他实现的可移植性

关于linux - 替换部分正则表达式并保留前缀/后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44236958/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com