2011-04-14 15 views
8

मैं एक बैश स्क्रिप्ट लिख रहा हूं जो लाइन द्वारा फ़ाइल लाइन पढ़ता है।बैश स्क्रिप्ट नियमित अभिव्यक्तियां ... सभी मैचों को कैसे ढूंढें और बदलें?

फ़ाइल एक .csv फ़ाइल है जिसमें प्रारूप डीडी/एमएम/वाईवाईवाईवाई में कई तिथियां हैं लेकिन मैं उन्हें वाई वाई वाई-एमएम-डीडी में बदलना चाहता हूं।

मैं नियमित अभिव्यक्ति का उपयोग कर डेटा से मेल खाता हूं, और इसे प्रतिस्थापित करता हूं कि फ़ाइल की सभी तिथियां YYYY-MM-DD के रूप में सही रूप से स्वरूपित होती हैं।

मेरा मानना ​​है कि यह नियमित अभिव्यक्ति दिनांक से मेल होगा:

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

लेकिन मैं regex मिलान प्राप्त करने के लिए कैसे पता नहीं है और उन्हें नए प्रारूप के साथ बदल सकते हैं या अगर यह एक 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

इस एसईडी उपयोग करने का प्रयास यह कर सकते हैं:

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 

पुनश्च: पर मैक sed -r

+0

@josh: बस उत्सुक अगर यह जवाब आप के लिए है या नहीं काम किया? – anubhava

16

शुद्ध बैश के बजाय sed -E का उपयोग करें।

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] 'का आदान-प्रदान करने का सुझाव देते हैं। –

संबंधित मुद्दे