mangs
mangs

Reputation: 29

removing arithmetic forms using sed

I want to remove ${} among arithmetic form in the file using sed for example abc=$(( ${var}+3 )) to abc=$(( var+3 ))

I'm using positional swapping in sed something like

sed -E 's/(\w+\W\$\(\( ) (\$\{) (\w+) (\}) (.*)/\1 \3 \5/g file.txt'

but it extracts only abc=3 when I use

echo abc=$((( ${var}+3 )) | sed -E 's/(\w+\W\$\(\( ) (\$\{) (\w+) (\}) (.*)/\1 \3 \5/' 

in terminal, just to check if it works all right

and it did nothing on shell script how can I remove only ${} part of the file?

I am using Mac OS and also tried on Ubuntu but it was still the same

Upvotes: 2

Views: 121

Answers (3)

petrus4
petrus4

Reputation: 614

printf="abc=\$(( \${var}+3 )) to abc=\$(( var+3 ))" | tr -d '{' | tr -d '}'

Upvotes: 1

RavinderSingh13
RavinderSingh13

Reputation: 133468

1st solution: Using capturing groups concept here and substituting matched values with captured values and only with which are required please try following sed code. Here is the Online Demo for used regex in sed code.

s='abc=$(( ${var}+3 ))' ##shell variable
sed -E 's/^([^=]*=\$\(\( )\$\{([^}]*)}(.*)$/\1\2\3/' <<<"$s"

OR use following in case you have an Input_file from where you want to substitute values.

sed -E 's/^([^=]*=\$\(\( )\$\{([^}]*)}(.*)$/\1\2\3/' Input_file


2nd solution: Using Perl's one-liner approach using Lazy match regex to make life easier here, one could try following.

perl -pe 's/^(.*?)\$\{(.*?)\}(.*)$/$1$2$3/' Input_file

Upvotes: 3

sseLtaH
sseLtaH

Reputation: 11217

Using sed

$ sed -E 's/\$\{([^}]*)}/\1/' input_file
abc=$(( var+3 ))

Upvotes: 4

Related Questions