regex - 替换两个字符串之间的多次出现

标签 regex bash perl awk sed

我需要将xxzz 之间的每个 字符a 替换为hello:

#input
a xxab abzz ca xxbczz aaa axxazza xxczzaxxczz
#output
a xxhellob hellobzz ca xxbczz aaa axxhellozza xxczzaxxczz

这适用于一对,它不适用于更多的 xx/zz 对(它替换第一个 xx 之间的每个 a最后一个 zz):

sed -r ':rep; s/(xx.*)a(.*zz)/\1hello\2/; trep'

我认为最好的方法是使用更高级的正则表达式,例如 perl

我正在寻找 bashsedawkperl 的解决方案。使用基本/扩展正则表达式甚至可以完成这项任务吗?当对具有更多字符(例如 xxxxxx/zzzzzz)时,不会变得难以理解的解决方案是首选。

最佳答案

是的,最好用Perl

perl -pe's/xx(.+?)zz/"xx".$1=~s|a|hello|gr."zz"/ge' file.txt

关于regex - 替换两个字符串之间的多次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105521/

相关文章:

php - preg_match 编程字符串

python - 确定 Python 对象是正则表达式还是字符串

ruby-on-rails - 在 bash 脚本中找不到 bundle 命令

linux - 在 Putty 中从计算机获取文件

regex - 如何使用 Perl 检测俄罗斯垃圾邮件帖子?

javascript - 使用变量创建 RegExp 对象时添加特殊字符

regex - 使用 sed 抓取字符串

bash - 用于从不同文件中选择多列并将输出打印到新文件中的 cut 命令

mysql - Perl 模块实例化 + DBI + fork "Mysql server has gone away"

perl - 在 Perl 正则表达式编译中使用未初始化值