Chúng tôi có thể sử dụng một trong hai sed
hoặc awk
để giải quyết hoàn toàn vấn đề.
Với sed
:
$ sed 's/^.\./0&/' file.txt
Khi &
xảy ra trong phần thay thế của lệnh thay thế ( s
), nó sẽ được mở rộng thành một phần của dòng đầu vào khớp với phần mẫu của lệnh.
Biểu thức chính quy ^.\.
có nghĩa là " khớp tất cả các dòng bắt đầu bằng ( ^
) một ký tự tùy ý ( .
) theo sau là một dấu chấm ( \.
) ".
Nếu dòng là 1.02.2017 23:40:00
, mẫu sẽ khớp và 1.
sẽ được thay thế bằng 01.
ở đầu dòng.
Với awk
:
Dựa trên awk
mã một phần trong câu hỏi ...
Điều này sẽ, như đã nêu, in ký tự thứ hai của mỗi dòng đầu vào:
$ awk '{ print substr($0, 2, 1) }' file.txt
Chúng ta có thể sử dụng thực tế substr($0, 2, 1)
trả về ký tự thứ hai và sử dụng nó làm điều kiện:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Mã đi vào { ... }
là mã bổ sung $0
, là nội dung của dòng hiện tại, với số 0 nếu điều kiện trước là đúng:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Sau đó, chúng ta chỉ cần đảm bảo rằng tất cả các dòng được in:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Điều kiện substr($0, 2, 1) == "."
tất nhiên cũng có thể được thay đổi thành biểu thức chính quy (chúng tôi sử dụng chính xác biểu thức giống như chúng tôi đã sử dụng trong sed
giải pháp):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Một số người nghĩ rằng "ngắn hơn luôn luôn tốt hơn" sẽ viết như
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(và có lẽ cũng loại bỏ hầu hết các khoảng trắng awk '/^.\./{$0="0"$0}1' file.txt
:)