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

Linux 替换部分正则表达式并保留前缀/后缀,linux,shell,sed,Linux,Shell,Sed,我试图使用sed替换文件中的一些字符串,但遇到了一个问题 我有以下字符串: TEMPLATE_MODULE TEMPLATE_SOME_ERR TEMPLATE_MORE_ERR 我想用一个不同的字符串替换TEMPLATE_模块,并替换以TEMPLATE开头、以ERR结尾的所有字符串,如下所示: TEMPLATE_MODULE ---> NEW_MODULE_NAME TEMPLATE_SOME_ERR ---> NEW_MODULE_NAME_SOME_ERR TEMPLAT

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

我有以下字符串:

TEMPLATE_MODULE
TEMPLATE_SOME_ERR
TEMPLATE_MORE_ERR
我想用一个不同的字符串替换TEMPLATE_模块,并替换以TEMPLATE开头、以ERR结尾的所有字符串,如下所示:

TEMPLATE_MODULE   ---> NEW_MODULE_NAME
TEMPLATE_SOME_ERR ---> NEW_MODULE_NAME_SOME_ERR
TEMPLATE_MORE_ERR ---> NEW_MODULE_NAME_MORE_ERR
模板_模块的更换很容易:

find . -type f -print -exec sed -i "s/TEMPLATE_MODULE/NEW_MODULE_NAME/g" {} +
虽然我不知道如何处理其他部分。如果我查找以TEMPLATE_u*开头的字符串,我还将捕获TEMPLATE_u模块

我还想保留一些错误或更多错误的后缀,以便此解决方案不起作用:

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
    ,而不匹配
    scat
    cate
  • s/\b模板模块\b/新模板模块名称/g
    将用
    新模板名称
    替换
    模板模块
  • s/\b模板\w*((一些(更多)错误)\b/NEW\u MODULE\u NAME\1/g
    将替换
    模板
    ,后跟以
    \u一些错误
    结尾的零个或多个单词字符或以
    新模块名
    结尾的
    更多错误
    和捕获的字符串
  • 解决方案是针对
    GNU-sed
    ,不确定其他实现的可移植性

考虑此示例输入

$ 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
    ,而不匹配
    scat
    cate
  • s/\b模板模块\b/新模板模块名称/g
    将用
    新模板名称
    替换
    模板模块
  • s/\b模板\w*((一些(更多)错误)\b/NEW\u MODULE\u NAME\1/g
    将替换
    模板
    ,后跟以
    \u一些错误
    结尾的零个或多个单词字符或以
    新模块名
    结尾的
    更多错误
    和捕获的字符串
  • 解决方案是针对
    GNU-sed
    ,不确定其他实现的可移植性
假设“模板模块”和“模板模块”是文字,但“某些错误”和“更多错误”是占位符,则以下情况似乎是可能的

sed "s/TEMPLATE\(_MODULE\)*/NEW_MODULE_NAME/"
我建议将其作为一个裸sed行使用,然后,如果可以的话,将其集成到您的命令行中

我认为这段代码不会比您自己的代码对事件和拼写做出更多假设。
但是,为了不意外地替换“SOMEOTHERTEMPLATE”等,您可能希望使用“锚定”

首先,这里是一个修改版本:

sed "s/\bTEMPLATE\(_MODULE\)*/NEW_MODULE_NAME/"
我建议您尝试以下方法:

TEMPLATE_MODULE  
TEMPLATE_SOME_ERR  
TEMPLATE_MORE_ERR  
OTHER_TEMPLATE_MODULE  
OTHER_TEMPLATE_SOME_ERR  
假设“TEMPLATE_MODULE”和“TEMPLATE_”是文字,而“SOME_ERR”和“MORE_ERR”是占位符,那么以下情况似乎是可能的

sed "s/TEMPLATE\(_MODULE\)*/NEW_MODULE_NAME/"
我建议将其作为一个裸sed行使用,然后,如果可以的话,将其集成到您的命令行中

我认为这段代码不会比您自己的代码对事件和拼写做出更多假设。
但是,为了不意外地替换“SOMEOTHERTEMPLATE”等,您可能希望使用“锚定”

首先,这里是一个修改版本:

sed "s/\bTEMPLATE\(_MODULE\)*/NEW_MODULE_NAME/"
我建议您尝试以下方法:

TEMPLATE_MODULE  
TEMPLATE_SOME_ERR  
TEMPLATE_MORE_ERR  
OTHER_TEMPLATE_MODULE  
OTHER_TEMPLATE_SOME_ERR  

你有GNU sed吗?输出
sed--version
?注意
*
是一个正则表达式全局匹配,而不是普通的全局扩展。您需要启用
-r
以支持它,这仅在
GNU sed
中可用。我正在使用GNU sed 4.2.2您的第二组字符串的替换模式是什么?@inan您不需要
-r
-E
用于
*
。。。默认情况下,
sed
将使用breyouhavegnused?输出
sed--version
?注意
*
是一个正则表达式全局匹配,而不是普通的全局扩展。您需要启用
-r
以支持它,这仅在
GNU sed
中可用。我正在使用GNU sed 4.2.2您的第二组字符串的替换模式是什么?@inan您不需要
-r
-E
用于
*
。。。默认情况下,
sed
将使用BreThank!
\1
是什么意思?@Vardit将拥有捕获的组。。看,谢谢!
\1
是什么意思?@Vardit将拥有捕获的组。。看见