2011-04-14 61 views
8

我正在写一个逐行读取文件的bash脚本。Bash脚本正则表达式...如何查找和替换所有匹配?

该文件是一个.csv文件,其中包含格式为DD/MM/YYYY的许多日期,但我想将它们更改为YYYY-MM-DD。

我会使用正则表达式匹配数据,并将其替换为使文件中的所有日期都格式化为YYYY-MM-DD。

我相信这个正则表达式将匹配日期:

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

但我不知道如何找到正则表达式匹配,并使用新的格式替换它们,或者如果这甚至有可能在bash脚本。请帮忙!

回答

2

可以使用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/' 
21

此使用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:在Mac上使用sed -E代替sed -r

+0

@josh:如果这个答案为你工作或不只是好奇? – anubhava 2014-02-17 10:15:25

16

纯猛砸。

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" 

输入文件

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

给出了下面的输出:

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

注意:一些编辑建议交换'BASH_REMATCH [2]'和'BASH_REMATCH [3]'。 – 2014-05-06 21:35:03