Wir können entweder das Problem verwenden sed
oder awk
es vollständig lösen.
Mit sed
:
$ sed 's/^.\./0&/' file.txt
Wenn dies &
im Ersatzteil des Ersetzungsbefehls ( s
) auftritt , wird es auf den Teil der Eingabezeile erweitert, der dem Musterteil des Befehls entspricht.
Der reguläre Ausdruck ^.\.
bedeutet " Alle Zeilen, die mit ( ^
) beginnen, mit einem beliebigen Zeichen ( .
) gefolgt von einem Literalpunkt ( \.
) abgleichen ".
Wenn die Linie ist 1.02.2017 23:40:00
, stimmt das Muster überein und 1.
wird 01.
am Anfang der Linie durch ersetzt.
Mit awk
:
Aufbauend auf dem awk
Teilcode in der Frage ...
Dadurch wird, wie angegeben, das zweite Zeichen jeder Eingabezeile gedruckt:
$ awk '{ print substr($0, 2, 1) }' file.txt
Wir können die Tatsache verwenden, dass substr($0, 2, 1)
das zweite Zeichen zurückgegeben wird, und dies als Bedingung verwenden:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Was geht, { ... }
ist Code, der vorangestellt ist $0
, was der Inhalt der aktuellen Zeile ist, mit einer Null, wenn die vorhergehende Bedingung wahr ist:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Dann müssen wir nur noch sicherstellen, dass alle Zeilen gedruckt werden:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Die Bedingung substr($0, 2, 1) == "."
kann natürlich auch in einen regulären Ausdruck geändert werden (wir verwenden genau den gleichen Ausdruck wie in der sed
Lösung):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Einige Leute, die denken, "kürzer ist immer besser", würden das als schreiben
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(und wahrscheinlich auch entfernen , die meisten Räume: awk '/^.\./{$0="0"$0}1' file.txt
)