Bash Script Regular Expressions…How to find and re

2019-02-21 20:00发布

问题:

I am writing a bash script that reads a file line by line.

The file is a .csv file which contains many dates in the format DD/MM/YYYY but I would like to change them to YYYY-MM-DD.

I would to match the data using a regular expression, and replace it such that all of the dates in the file are correctly formatted as YYYY-MM-DD.

I believe this regular expression would match the dates:

([0-9][0-9]?)/([0-9][0-9]?)/([0-9][0-9][0-9][0-9])

But I do not know how to find regex matches and replace them with the new format, or if this is even possible in a bash script. Please help!

回答1:

Try this using sed:

line='Today is 10/12/2010 and yesterday was 9/11/2010'
echo "$line" | sed -r 's#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#\3-\2-\1#g'

OUTPUT:
Today is 2010-12-10 and yesterday was 2010-11-9

PS: On mac use sed -E instead of sed -r



回答2:

Pure Bash.

infile='data.csv'

while read line ; do
  if [[ $line =~ ^(.*),([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}),(.*)$ ]] ; then
    echo "${BASH_REMATCH[1]},${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]},${BASH_REMATCH[5]}"
  else
    echo "$line"
  fi
done < "$infile"

The input file

xxxxxxxxx,11/03/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/04/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/05/2012,yyyyyyyyyyyyy          
xxxxxxxxx,10/06/2011,yyyyyyyyyyyyy          

gives the following output:

xxxxxxxxx,2011-03-11,yyyyyyyyyyyyy
xxxxxxxxx,2011-04-10,yyyyyyyyyyyyy
xxxxxxxxx,2012-05-10,yyyyyyyyyyyyy
xxxxxxxxx,2011-06-10,yyyyyyyyyyyyy


回答3:

You can do it using sed

echo "11/12/2011" | sed -E 's/([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9][0-9][0-9])/\3-\2-\1/'