user645527
user645527

Reputation: 103

Using sed to make replacements only within part of a line

How to replace '.' with '_' within the part of the line before the '=' char in the input below

Need single sed command to do all three

echo "few.num.dots=/home/user/.hidden/folder.dot" | sed 's/\./_/g'

required output => few_num_dots=/home/user/.hidden/folder.dot

echo "var=nodot" | sed 's/\./_/g'

required output => var=nodot

echo "var.one=onedot.notthis" | sed 's/\./_/g'

required output => var_one=onedot.notthis

Upvotes: 3

Views: 900

Answers (5)

potong
potong

Reputation: 58371

This might work for you (GNU sed):

sed 's/=/\n&/;h;y/./_/;G;s/\n.*\n.*\n//' file

Insert a marker to divide the line, copy the line, translate the characters, append the original line and using the marker reconstitute the line.

Upvotes: 0

BMW
BMW

Reputation: 45233

Using awk

$  echo "few.num.dots=/home/user/.hidden/folder.dot"  |awk '/=/{gsub(/\./,"_",$1)}1' FS="=" OFS="="
few_num_dots=/home/user/.hidden/folder.dot

$ echo "var.one=onedot.notthis" |awk '/=/{gsub(/\./,"_",$1)}1' FS="=" OFS="="
var_one=onedot.notthis

Upvotes: 0

iamauser
iamauser

Reputation: 11469

You can do it this way as well,

echo "few.num.dots=/home/user/.hidden/folder.dot" |
sed -e '1,/./s/\./_/' -e '1,/./s/\./_/'

few_num_dots=/home/user/.hidden/folder.dot

First -e replaces the first occurrence of the pattern ., next -e replaces the next one...

Upvotes: 0

Birei
Birei

Reputation: 36262

You can use a conditional branching using the t command. It does a loop until the substitution command fails, and the command replaces any . character followed by an equal sign:

echo "few.num.dots=/home/user/.hidden/folder.dot" | 
  sed ':a; s/\.\([^=]*=\)/_\1/; ta'

It yields:

few_num_dots=/home/user/.hidden/folder.dot

Upvotes: 2

glenn jackman
glenn jackman

Reputation: 246774

perl?

echo "few.num.dots=/home/user/.hidden/folder.dot" | 
perl -pe 's/^[^=]+/ ($x=$&) =~ tr{.}{_}; $x /e'
few_num_dots=/home/user/.hidden/folder.dot

awk?

awk -F= -v OFS='=' '{gsub(/\./,"_",$1)} 1'

Upvotes: 1

Related Questions