Мы можем использовать 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)