ฉันมีปัญหาในการทำให้ซิงก์ของฉันช้าลงเพื่อเพิ่มตัวเลขนำหน้าจำนวนหนึ่งให้กับรูปแบบองค์กรตัวเลข สตริงที่ฉันกำลังทำงานอยู่นั้นดูเหมือนว่า
1.1.1.1,Some Text Here
ใช้ประโยชน์จากไวยากรณ์ซิด
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
ฉันสามารถกระตุ้นการตอบสนองได้
01.01.01.01,Some Text Here
อย่างไรก็ตามสิ่งที่ฉันกำลังมองหาคือสิ่งที่เติมศูนย์ถึง 2 หลักในฟิลด์ 2 และ 3 และ 3 และ 3 หลักในฟิลด์ 4 เพื่อให้รายการทั้งหมดมีความยาวมาตรฐานที่ [0-9] [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
สำหรับชีวิตของฉันฉันไม่สามารถคิดได้ถึงวิธีการปรับเปลี่ยนขอบเขตเพื่อรวมพารามิเตอร์ที่จำเป็นในการถ่ายภาพเป็นตัวเลขเท่านั้นหลังจากระยะ ฉันคิดว่ามันมีบางอย่างเกี่ยวกับการใช้ \ b ซึ่งฉันเข้าใจการจับคู่ศูนย์อักขระที่ขอบเขตคำ แต่ฉันไม่เข้าใจว่าทำไมความพยายามของฉันในการเพิ่มช่วงเวลาในการแข่งขันล้มเหลวดังนี้:
sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang
sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:
1.01.01.1,Some Text Here
นอกจากนี้ฉันคาดหวังว่าฉันจะมีปัญหาเพิ่มเติมหากคำสั่งมีข้อความเช่น:
1.1.1.1,Some Number 1 Here
มันเป็นข้อสรุปมาก่อนว่าฉันจำเป็นต้องเรียนรู้ที่แท้จริงและความซับซ้อนทั้งหมดของมัน ฉันกำลังดำเนินการอยู่ แต่คาดว่าข้อความนี้จะทำให้ฉันเดือดร้อนอยู่พักหนึ่ง ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.
แก้ไข: ฉันพบวิธี ... ข้อความนี้ดูเหมือนจะทำสิ่งที่ฉันกำลังมองหา แต่ต้องมีวิธีที่สง่างามกว่านี้
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
นอกจากนี้วากยสัมพันธ์นี้จะทำให้เกิดปัญหาหากรูปแบบตัวเลขที่คล้ายกันปรากฏในข้อความ ... คล้ายกับ:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
ในกรณีนี้มันจะส่งผลให้:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
แก้ไขแล้ว ขอบคุณสำหรับความช่วยเหลือของคุณที่นี่ ฉันเริ่มแก้ไขปัญหาด้วยคำตอบที่ฉันตอบไว้ด้านล่าง ฉันรู้สึกว่าได้ย้ายโซลูชันไปยัง Python ซึ่งเป็นส่วนหนึ่งของโซลูชันที่มีขนาดใหญ่กว่าซึ่งใช้ประโยชน์จากการจัดเรียงด้านล่าง:
def getPaddedKey(line):
keyparts = line[0].split(".")
keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
return '.'.join(keyparts)
s=sorted(reader, key=getPaddedKey)
printf
(หรือprintf
โทรภายใน Awk) อาจตรงไปตรงมามากกว่า
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
อย่างไรก็ตามฉันชอบที่จะรู้ว่ามีวิธีการที่สง่างามมากขึ้น