Val
Val

Reputation: 209

Replace string by regex

I have bunch of string like "{one}two", where "{one}" could be different and "two" is always the same. I need to replace original sting with "three{one}", "three" is also constant. It could be easily done with python, for example, but I need it to be done with shell tools, like sed or awk.

Upvotes: 0

Views: 130

Answers (7)

Avinash Raj
Avinash Raj

Reputation: 174706

Through GNU sed,

$ echo 'foo {one}two bar' | sed -r 's/(\{[^}]*\})two/three\1/g'
foo three{one} bar

Basic sed,

$ echo 'foo {one}two bar' | sed 's/\({[^}]*}\)two/three\1/g'
foo three{one} bar

Upvotes: 0

martin
martin

Reputation: 3239

awk '/{.*}two/ { split($0,s,"}"); print "three"s[1]"}" }' <<< "{one}two"

does also output

three{one}

Here, we are using awk to find the correct lines, and then split on "}" (which means your lines should not contain more than the one to indicate the field).

Upvotes: 0

a5hk
a5hk

Reputation: 7834

awk '{a=gensub(/(.*)two/,"three\\1","g"); print a}' <<< "{one}two"

Output:

three{one}

Upvotes: 0

John B
John B

Reputation: 3646

Here's a Bash only solution:

string="{one}two"
echo "three${string/two/}"

Upvotes: 1

Beggarman
Beggarman

Reputation: 896

If I understand correctly, you want:

{one}two --> three{one}
{two}two --> three{two}
{n}two   --> three{n}

SED with a backreference will do that:

echo "{one}two" | sed 's/\(.*\)two$/three\1/'

The search store all text up to your fixed string, and then replace with the your new string pre-appended to the stored text. SED is greedy by default, so it should grab all text up to your fixed string even if there's some repeat in the variable part (e.gxx`., {two}two will still remap to three{two} properly).

Upvotes: 2

Alexander Tarasov
Alexander Tarasov

Reputation: 468

echo "XXXtwo" | sed -E 's/(.*)two/three\1/'

Upvotes: 1

anubhava
anubhava

Reputation: 785146

Using sed:

s="{one}two"
sed 's/^\(.*\)two/three\1/' <<< "$s"
three{one}

Upvotes: 2

Related Questions