Możemy użyć albo, sedalbo awkcałkowicie rozwiązać problem.
Z sed:
$ sed 's/^.\./0&/' file.txt
Kiedy &występuje w części zastępującej polecenia podstawienia ( s), zostanie on rozwinięty do części wiersza wejściowego, która odpowiada części wzorcowej polecenia.
Wyrażenie regularne ^.\.oznacza „ dopasuj wszystkie linie rozpoczynające się od ( ^) dowolnego znaku ( .), po którym następuje dosłowna kropka ( \.) ”.
Jeśli linia jest 1.02.2017 23:40:00, wzór będzie pasował i 1.zostanie zastąpiony przez 01.na początku linii.
Z awk:
Opierając się na częściowym awkkodzie w pytaniu ...
Spowoduje to, jak powiedziano, wydrukowanie drugiego znaku każdego wiersza wprowadzania:
$ awk '{ print substr($0, 2, 1) }' file.txt
Możemy użyć faktu, który substr($0, 2, 1)zwraca drugi znak i użyć go jako warunku:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Wchodzi w { ... }to kod $0, który jest poprzedzany, czyli zawartość bieżącego wiersza, z zerem, jeśli powyższy warunek jest prawdziwy:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Następnie musimy tylko upewnić się, że wszystkie linie są wydrukowane:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Warunek substr($0, 2, 1) == "."można oczywiście zmienić również na wyrażenie regularne (używamy dokładnie tego samego wyrażenia, co w sedrozwiązaniu):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Niektórzy ludzie, którzy myślą, że „krótszy jest zawsze lepszy” napisaliby to jako
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(i prawdopodobnie również usunąć większość miejsc: awk '/^.\./{$0="0"$0}1' file.txt)