Ми можемо використати будь- яку проблему 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
)