I am writing a bash script that reads a file line by line.
我正在编写一个逐行读取文件的bash脚本。
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.
该文件是一个.csv文件,其中包含许多日期,格式为DD/MM/ yyyyy,但我想将它们更改为yyyyy -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.
我将使用正则表达式匹配数据,并替换它,这样文件中的所有日期都正确格式化为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!
但是我不知道如何找到regex匹配项并将它们替换为新的格式,或者在bash脚本中是否可能这样做。请帮助!
3 个解决方案
#1
21
Try this using sed:
使用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
在mac上使用sed -E而不是sed -r
#2
16
Pure Bash.
纯粹的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
2
You can do it using sed
您可以使用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/'
#1
21
Try this using sed:
使用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
在mac上使用sed -E而不是sed -r
#2
16
Pure Bash.
纯粹的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
2
You can do it using sed
您可以使用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/'