Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 858
PesaThe Avatar asked Jan 02 '23 23:01

PesaThe


1 Answers

Yes, it's best to use Perl

perl -pe's/xx(.+?)zz/"xx".$1=~s|a|hello|gr."zz"/ge' file.txt
like image 82
Hynek -Pichi- Vychodil Avatar answered Jan 10 '23 16:01

Hynek -Pichi- Vychodil