जीरो-फिल नंबर सेड के साथ 2 अंक तक


19

इनपुट:

201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG

वांछित उत्पादन:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

0यदि "केवल 1" भाग में कोई एकल अंक है, तो मैं कैसे जोड़ सकता हूं ? मुझे इस तिथि प्रारूप की आवश्यकता है: YYYYMM DD

जवाबों:


13
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

क्या आप बता सकते हैं कि यह कैसे काम करता है? यह पहली बार है जब मैं उस \<[0-9]\>निर्माण को देख रहा हूं जो मुझे लगता है कि एकल अंकों के मिलान के लिए जिम्मेदार है लेकिन यह सुनिश्चित नहीं है कि इस निर्माण को क्या कहा जाता है। धन्यवाद।
sasuke

2
\ <का अर्थ है: एक 'शब्द' की शुरुआत ... [0-9] का अर्थ है 0 से 9 तक एक एकल अंक ... \> का अर्थ है: एक 'शब्द' का अंत ... शब्द: एक टोकन जो व्हाट्सएप सीमांकित है (या पंक्ति के प्रारंभ / अंत में, क्रमशः \ <और \> के लिए शुरू / समाप्त होता है) ... पीएस। मैंने सिर्फ विराम चिह्नों की कोशिश की .. वे भी परिसीमनकर्ता हैं।
पीटर

1
आप कोष्ठक पर कब्जा किए बिना भी ऐसा कर सकते हैं: &प्रतिस्थापन स्ट्रिंग में मिलान किए गए sed 's/\<[0-9]\>/0&/'
एलएचएस का

ओह, पता नहीं था कि <>शेल रेगेक्स सिंटैक्स में एक शब्द सीमा क्या है। यह सोचने के लिए, यहां तक ​​कि `sed 's / \ b [0-9] \ b / 0 और /' भी काम करता है। आप दोनों को धन्यवाद। :)
ससुके

@sasuke: <>की एक विशेषता है विस्तारित regex (की नहीं जैसे खोल,) ... कौन सा संस्करण और जो विकल्प का उपयोग करें पर निर्भर करता है, sedऔर shellदोनों का उपयोग कर सकते हैं या तो बढ़ा या मानक regex ... मानक regex का उपयोग करता है\<\>
पीटर। हे


2

यहां विस्तारित रेगेक्स के साथ बैश का उपयोग करने का एक (गैर-सेड) तरीका है । यह विधि, अलग-अलग लाइनों के अधिक जटिल प्रसंस्करण करने की अनुमति देती है। (यानी, केवल रेगेक्स प्रतिस्थापन से अधिक)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

उत्पादन:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

1

मैं ऐसा कुछ करूंगा:

sed -E 's/ ([0-9]) / 0\1 /' ./input

यह एकांत संख्या में पकड़ लेता है, उन्हें एक समूह के साथ व्हाट्सएप पर ले जाता है ' ([0-9]) ', फिर उन्हें 0 और व्हाट्सएप पैडिंग के साथ वापस रखता है ' 0\1 '

-Eविकल्प (ताकि आप उपयोग करने के लिए की जरूरत नहीं है पर OSX आधुनिक रेगुलर एक्सप्रेशन से भाव के लिए अनुमति देता है "\"तो अक्सर), -rLinux सिस्टम मैं परीक्षण किया है पर एक ही बात करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.