Tim Kersten
Tim Kersten

Reputation: 579

Can sed search & replace on a match if that match in only part of a line?

The sed below will output the input exactly. What I'd like to do is replace all occurrences of _ with - in the first matching group (\1), but not in the second. Is this possible?

echo 'abc_foo_bar=one_two_three' | sed 's/\([^=]*\)\(=.*\)/\1\2/'
abc_foo_bar=one_two_three

So, the output I'm hoping for is:

abc-foo-bar=one_two_three

I'd prefer not to resort to awk since I'm doing a string of other sed commands too, but I'll resort to that if I have to.

Edit: Minor fix to RE

Upvotes: 4

Views: 376

Answers (4)

potong
potong

Reputation: 58371

This might work for you:

echo 'abc_foo_bar=one_two_three' | 
sed 's/^/\n/;:a;s/\n\([^_=]*\)_/\1-\n/;ta;s/\n//'
abc-foo-bar=one_two_three

Or this:

echo 'abc_foo_bar=one_two_three' | 
sed 'h;s/=.*//;y/_/-/;G;s/\n.*=/=/'
abc-foo-bar=one_two_three

Upvotes: 1

Matvey Aksenov
Matvey Aksenov

Reputation: 3900

You could use ghc instead of sed as follows:

echo "abc_foo_bar=one_two_three" | ghc -e "getLine >>= putStrLn . uncurry (++) . (map (\x -> if x == '_' then '-' else x) *** id) . break (== '=')"

The output would be, as expected:

abc-foo-bar=one_two_three

Upvotes: 1

Michael J. Barber
Michael J. Barber

Reputation: 25042

You can do this in sed using the hold space:

$ echo 'abc_foo_bar=one_two_three' | sed 'h; s/[^=]*//; x; s/=.*//; s/_/-/g; G; s/\n//g'
abc-foo-bar=one_two_three

Upvotes: 3

jcollado
jcollado

Reputation: 40374

You could use awk instead of sed as follows:

echo 'abc_foo_bar=one_two_three' | awk -F= -vOFS== '{gsub("_", "-", $1); print $1, $2}'

The output would be, as expected:

abc-foo-bar=one_two_three

Upvotes: 1

Related Questions