Ми можемо використати будь- яку проблему 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
У цьому випадку входить { ... }код, який передує $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)