Kami dapat menggunakan salah satu sed
atau awk
untuk 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 awk
kode 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 sed
solusi):
$ 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
)