vf58bwk4
vf58bwk4

Reputation: 17

How to replace consecutive symbols using only one sed command?

I have a simple .csv file with lines that holds 't' values. Here is the example:

2ABC;t;t;t;tortuga;fault;t;t;bored

I want to replace them to '1' using sed.

If I make sed "s/;t;/;1;/g" I get the next result:

2ABC;1;t;1;tortuga;fault;1;t;bored

As you can see, consecutive ';t;' have been replaced through one. Yes, I can replace all ';t;' by sed -e "s/;t;/;1;/g" -e "s/;t;/;1;/g" but this is boring.

How can I make the replacement by one sed command?

Upvotes: 1

Views: 80

Answers (3)

RARE Kpop Manifesto
RARE Kpop Manifesto

Reputation: 2821

echo '2ABC;t;t;t;tortuga;fault;t;t;bored' | 

gawk-specific solution

 gawk -be '(ORS = RT)^!(NF = NF)' FS='^t$' OFS=1 RS=';'

— cross-awk-solution

{m,g,n}awk 'gsub(FS, OFS, $!(NF = NF))^_' FS=';t;' OFS=';1;' RS=
2ABC;1;1;1;tortuga;fault;1;1;bored

Upvotes: 0

Sundeep
Sundeep

Reputation: 23667

Lookarounds is helpful in such cases:

$ s='t;2ABC;t;t;t;tortuga;fault;t;t;bored;t'
$ echo "$s" | perl -lpe 's/(?<![^;])t(?![^;])/1/g'
1;2ABC;1;1;1;tortuga;fault;1;1;bored;1

Upvotes: 0

KamilCuk
KamilCuk

Reputation: 141155

If there is something to replace, branch to replace again.

sed ': again; /;t;/{ s//;1;/; b again }'

Overall, parsing cvs with sed is crude. Consider awk.

awk -F';' -v OFS=';' '{ for(i=1;i<=NF;++i) if ($i=="t") $i=1 } 1'

Upvotes: 4

Related Questions