Linux 替换部分正则表达式并保留前缀/后缀
我试图使用sed替换文件中的一些字符串,但遇到了一个问题 我有以下字符串: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
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将拥有捕获的组。。看见