Home > database >  Using SED to substitute regex match with variable value
Using SED to substitute regex match with variable value

Time:11-23

I have a file with following lines:

2022-Nov-23
2021-Jul-14

I want to replace the month with its number, my script should accept the date as an argument, and I added these variables to it:

Jan=01
Feb=02
Mar=03
Apr=04
May=05
Jun=06
Jul=07
Aug=08
Sep=09
Oct=10
Nov=11
Dec=12

How can I match the month name in the string with regex and substitute it based on the variables? here is what I have for now:

echo "$1" | sed 's/(\w{3})/${\1}/'

But it doesn't work.

CodePudding user response:

With a file called months containing:

Jan=01
Feb=02
Mar=03
Apr=04
May=05
Jun=06
Jul=07
Aug=08
Sep=09
Oct=10
Nov=11
Dec=12

And a script:

#!/bin/sh

sub() (
  set -a
  . "${0%/*}/months"
  awk -F- -vOFS=- '{ $2 = ENVIRON[$2]; print }'
)

printf 2022-Nov-23 | sub
printf 2021-Jul-14 | sub

The output is:

2022-11-23
2021-07-14

CodePudding user response:

You might convert your data into sed script, that is create say file mon2num.sed with following content

s/Jan/01/
s/Feb/02/
s/Mar/03/
s/Apr/04/
s/May/05/
s/Jun/06/
s/Jul/07/
s/Aug/08/
s/Sep/09/
s/Oct/10/
s/Nov/11/
s/Dec/12/

and having file.txt with content as follows

2022-Nov-23
2021-Jul-14

you might do

sed -f mon2num.sed file.txt

which gives output

2022-11-23
2021-07-14
  • Related