user1198484
user1198484

Reputation: 105

sed replace character only between two known strings

Is it possible to replace a character between two known strings only? I have a number of files in the format

title.header.index.subtitle.goes.here.footer

I can pick out the "subtitle.goes.here" with pattern matching between the index (which I need to backreference) and a footer (which is constant), but I then want to replace the period/dot character with an underscore, to give me

title.header.index.subtitle_goes_here.footer

So from input such as

title.header.01.the.first.subtitle.is.here.footer

I want to end up with

title.header.01.the_first_subtitle_is_here.footer

What I have so far is useless, but a start: sed -r 's/([0-9][0-9]\.)([a-z]*\.*)*footer/\1footer/g'

But this is removing the entire subtitle and footer before manually adding it back in and has plenty of other flaws I'm sure. Any help would be much appreciated.

Upvotes: 4

Views: 4622

Answers (2)

jaypal singh
jaypal singh

Reputation: 77075

If you are open to awk solution then this might help -

awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 

Input File:

[jaypal:~/Temp] cat file
title.header.index.subtitle.goes.here.footer
title.header.01.the.first.subtitle.is.here.footer

Test:

[jaypal:~/Temp] awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 
title.header.index.subtitle_goes_here.footer
title.header.01.the_first_subtitle_is_here.footer

Upvotes: 1

potong
potong

Reputation: 58351

This might work for you:

echo "title.header.01.the.first.subtitle.is.here.footer" |
sed 's/\./_/4g;s/.\(footer\)/.\1/'
title.header.01.the_first_subtitle_is_here.footer

An ugly alternative:

sed 'h;s/\([0-9][0-9]\.\).*\(\.footer\)/\1\n\2/;x;s/.*[0-9][0-9]\.\(.*\).footer/\1/;s/\./_/g;x;G;s/\(\n\)\(.*\)\1\(.*\)/\3\2/' file

Upvotes: 4

Related Questions