เราอาจใช้วิธีใดวิธีหนึ่ง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
)