Możemy użyć albo, sed
albo awk
cał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 awk
kodzie 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 sed
rozwią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
)