Search code examples
regexbashperlawksed

Replace multiple occurrences between two strings


I need to replace every character a between xx and zz with hello:

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

This works for one pair, it doesn't work for more xx/zz pairs (it replaces every a between the first xx and last zz):

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

I assume the best approach is to use more advanced regex, such as perl.

I am looking for a solution in bash, sed, awk or perl. Is this task even possible with basic/extended regex? Solutions that will not become hard to digest when the pairs have more characters (for example xxxxxx/zzzzzz) are preferred.


Solution

  • Yes, it's best to use Perl

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