2011-04-14 43 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