เราอาจใช้วิธีใดวิธีหนึ่งsedหรือawkเพื่อแก้ปัญหาอย่างสมบูรณ์
ด้วยsed:
$ sed 's/^.\./0&/' file.txt
เมื่อ&เกิดขึ้นในส่วนการแทนที่ของคำสั่งการแทนที่ ( s) มันจะถูกขยายไปยังส่วนของบรรทัดอินพุตที่ตรงกับส่วนรูปแบบของคำสั่ง
นิพจน์ทั่วไป^.\.หมายถึง " จับคู่ทุกบรรทัดที่ขึ้นต้นด้วย ( ^) อักขระใด ๆ ( .) ตามด้วยตัวอักษรจุด ( \.) "
หากบรรทัดอยู่1.02.2017 23:40:00รูปแบบจะจับคู่และ1.จะถูกแทนที่ด้วย01.ที่จุดเริ่มต้นของบรรทัด
ด้วยawk:
การสร้างawkรหัสบางส่วนในคำถาม ...
ตามที่ระบุไว้นี้พิมพ์อักขระตัวที่สองของแต่ละบรรทัดของอินพุต:
$ awk '{ print substr($0, 2, 1) }' file.txt
เราสามารถใช้ข้อเท็จจริงที่substr($0, 2, 1)ส่งคืนอักขระตัวที่สองและใช้เป็นเงื่อนไขได้:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
สิ่งที่เข้าสู่{ ... }คือโค้ดที่ prepends $0ซึ่งเป็นเนื้อหาของบรรทัดปัจจุบันโดยมีศูนย์ถ้าเงื่อนไขก่อนหน้าเป็นจริง:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
จากนั้นเราต้องตรวจสอบให้แน่ใจว่ามีการพิมพ์บรรทัดทั้งหมด:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
substr($0, 2, 1) == "."แน่นอนว่าเงื่อนไขอาจถูกเปลี่ยนเป็นนิพจน์ทั่วไปด้วย (เราใช้นิพจน์เดียวกับที่ใช้ในการsedแก้ปัญหา):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
บางคนที่คิดว่า "สั้นกว่าดีกว่าเสมอ" จะเขียนว่าเป็น
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(และอาจลบการเว้นวรรคส่วนใหญ่ด้วยawk '/^.\./{$0="0"$0}1' file.txt)