2011-04-14 16 views
8

Dosya satırını okuyan bir bash komut dosyası yazıyorum.Bash Komut Dosyası Düzenli İfadeler ... Tüm eşleşmeleri bulmak ve değiştirmek nasıl?

Dosya, DD/AA/YYYY biçiminde birçok tarih içeren bir .csv dosyasıdır ancak bunları YYYY-AA-GG olarak değiştirmek istiyorum.

Verileri normal bir ifade kullanarak eşleştirip dosyadaki tüm tarihlerin YYYY-AA-GG biçiminde doğru şekilde biçimlendirilmesini sağlayacağım.

Bu normal ifade tarihleri ​​eşleşir inanıyoruz:

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

Ama düzenli ifade eşleşmeleri bulmak için nasıl ve yeni formatla bunların yerine veya bu bir bash komut bile mümkün olup olmadığını bilmiyorum. Lütfen yardım et!

cevap

2

Sen 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

bu sed kullanmayı deneyin kullanarak bunu yapabilirsiniz:

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 yerine sed -r

+0

@josh: Bu yanıt sizin için ya da değil çalışıp çalışmadığını Sadece merak? – anubhava

16

Saf Bash sed -E kullanmak On.

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" 

girdi dosyası

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

şu çıktıyı verir:

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

Not: bazı düzenleyiciler BASH_REMATCH [2] ve BASH_REMATCH [3] 'ü değiştirmeyi önerir. –