Kami dapat menggunakan salah satu sedatau awkuntuk sepenuhnya menyelesaikan masalah.
Dengan sed:
$ sed 's/^.\./0&/' file.txt
Ketika &terjadi di bagian penggantian dari perintah substitusi ( s), itu akan diperluas ke bagian dari garis input yang cocok dengan bagian pola dari perintah.
Ekspresi reguler ^.\.berarti " cocok dengan semua baris yang dimulai dengan ( ^) karakter arbitrer ( .) diikuti oleh titik literal ( \.) ".
Jika garisnya 1.02.2017 23:40:00, polanya akan cocok, dan 1.akan diganti dengan 01.di awal garis.
Dengan awk:
Membangun awkkode parsial dalam pertanyaan ...
Ini akan, seperti yang dinyatakan, mencetak karakter kedua dari setiap baris input:
$ awk '{ print substr($0, 2, 1) }' file.txt
Kita dapat menggunakan fakta yang substr($0, 2, 1)mengembalikan karakter kedua dan menggunakannya sebagai syarat:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Apa yang masuk ke dalam { ... }adalah kode yang diawali $0, yang merupakan isi dari baris saat ini, dengan nol jika kondisi sebelumnya benar:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Maka kita hanya perlu memastikan bahwa semua garis dicetak:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Kondisi substr($0, 2, 1) == "."tentu saja dapat diubah menjadi ekspresi reguler juga (kami menggunakan ekspresi yang sama persis seperti yang kami gunakan dalam sedsolusi):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Beberapa orang yang berpikir "lebih pendek selalu lebih baik" akan menuliskannya sebagai
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(dan mungkin juga menghapus sebagian spasi: awk '/^.\./{$0="0"$0}1' file.txt)