เติมตัวเลขศูนย์ให้เหลือ 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

ฉันจะเพิ่ม a ได้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]\>ก่อสร้างที่ฉันคิดว่าเป็นคนที่รับผิดชอบในการจับคู่หลักเดียว แต่ไม่แน่ใจว่าสิ่งที่เรียกว่าโครงสร้างนี้ ขอบคุณ
สึเกะ

2
\ <หมายถึง: เริ่มต้นของ 'คำ' ... [0-9] หมายถึงหลักเดียวจาก 0 ถึง 9 ... \> หมายถึง: จุดสิ้นสุดของ 'คำ' ... คำ: โทเค็นซึ่งเป็นตัวคั่นช่องว่าง (หรือเริ่ม / สิ้นสุดที่จุดเริ่มต้น / สิ้นสุดของบรรทัดสำหรับ \ <และ \> ตามลำดับ) ... PS ฉันแค่ลองเครื่องหมายวรรคตอน .. พวกมันก็เป็นตัวคั่นด้วย
Peter.O

1
นอกจากนี้คุณยังสามารถทำได้โดยไม่ต้องจับวงเล็บ: &ในสตริงการแทนที่จะใช้ LHS ที่ตรงกัน -sed 's/\<[0-9]\>/0&/'
glenn jackman

โอ้ไม่ทราบว่า<>เป็นขอบเขตของคำในไวยากรณ์ regex ของเชลล์ ลองคิดดูสิแม้แต่ `sed 's / \ b [0-9] \ b / 0 & /' ก็ใช้ได้เช่นกัน ขอบคุณทั้งคู่ :)
sasuke

@sasuke: <>เป็นคุณสมบัติของExtended regex (ไม่ใช่เชลล์เช่นนี้) ... ขึ้นอยู่กับเวอร์ชันและตัวเลือกที่คุณใช้sedและshellทั้งสองสามารถใช้ทั้ง regex มาตรฐานหรือขยาย ... regex มาตรฐานใช้\<\>
Peter O


2

นี่คือ (ไม่ใช่ sed) วิธีการใช้ทุบตีด้วยregex ขยาย ..
วิธีการนี้จะช่วยให้ขอบเขตที่จะทำในการประมวลผลที่ซับซ้อนมากขึ้นของแต่ละบรรทัด (เช่นมากกว่าการแทนที่ regex)

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ตัวเลือกที่ช่วยให้การแสดงออก RegEx ที่ทันสมัยใน OSX (ดังนั้นคุณจึงไม่ต้องใช้"\"จึงมักจะ) -rจะเป็นสิ่งเดียวกันบนระบบลินุกซ์ผมเคยทดสอบ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.