
Ich versuche, am Anfang eine 0 hinzuzufügen, WENN beim zweiten Zeichen dieser Zeile ein "." steht. Ich konnte diese beiden nicht kombinieren;
awk '{ print substr( $0, 2, 1 ) }' file.txt
zeigt das zweite Zeichen
sed -ie "s/.\{0\}/0/" file.txt
durch Hinzufügen einer Null am Anfang.
Es sollte ein „wenn das zweite Zeichen ein Punkt ist“ geben.
Beispieldatei:
1.02.2017 23:40:00
10.02.2017 23:40:00
Finale:
01.02.2017 23:40:00
10.02.2017 23:40:00
Antwort1
Wir können entweder sed
oder verwenden awk
, um das Problem vollständig zu lösen.
Mit sed
:
$ sed 's/^.\./0&/' file.txt
Wenn &
im Ersetzungsteil des Ersetzungsbefehls ( s
) vorkommt, wird es auf den Teil der Eingabezeile erweitert, der mit dem Musterteil des Befehls übereinstimmt.
Der reguläre Ausdruck ^.\.
bedeutet "passt zu allen Zeilen, die mit ( ^
) einem beliebigen Zeichen ( .
) beginnen, gefolgt von einem Punkt ( \.
)".
Wenn die Zeile ist 1.02.2017 23:40:00
, stimmt das Muster überein und 1.
wird 01.
am Anfang der Zeile durch ersetzt.
Mit awk
:
Aufbauend auf dem Teilcode awk
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, dass substr($0, 2, 1)
das zweite Zeichen zurückgegeben wird, als Bedingung verwenden:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Es handelt sich { ... }
um Code $0
, der dem Inhalt der aktuellen Zeile eine Null voranstellt, wenn die vorhergehende Bedingung erfüllt 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 denselben Ausdruck, den wir in der sed
Lösung verwendet haben):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Manche Leute, die denken "kürzer ist immer besser", würden das so schreiben:
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(und wahrscheinlich auch die meisten Leerzeichen entfernen: awk '/^.\./{$0="0"$0}1' file.txt
)
Antwort2
Mit sed:
sed -e "/^.\./s/^/0/" file.txt
Das Muster /^.\./
sucht am Zeilenanfang nach einem beliebigen Zeichen und einem wörtlichen Punkt ^
und ersetzt, wenn dies übereinstimmt, s
diesen Zeilenanfang durch eine Null, wodurch die Null effektiv an den Anfang angehängt wird.
Der sed-Ausdruck s/.\{0\}/0/
ist etwas seltsam, er gleicht null oder mehr Kopien von irgendetwas ab und ersetzt sie durch eine Null. Das Muster wird natürlich an jeder Stelle der Zeichenfolge übereinstimmen, aber da s///
nur die erste Übereinstimmung ersetzt wird, funktioniert es wie beabsichtigt. Trotzdem eine kuriosere Art, es zu tun.
Oder mit awk würde ein ähnlicher regulärer Ausdruck funktionieren, um die Zeile abzugleichen, aber wir können Folgendes verwenden substr
:
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
Wir testen zunächst, ob das zweite Zeichen ein Punkt ist, und fügen dann in diesem Fall eine Null an den Zeilenanfang hinzu. Der letzte Schritt ruft die Standardaktion auf, die Zeile nach allen Änderungen auszudrucken.
Antwort3
Sie sagten awk und sed, aber es scheint, als würden Sie versuchen, ein Datum zu formatieren, und dafür würde ich den date
Befehl verwenden. Zum Beispiel:
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
wird ausgeben
01.02.2017 23:40:00
Der sed
Befehl in der Mitte ändert die Punkte in Schrägstriche für die Eingabe in date -d
. Die Formatoptionen ermöglichen die Ausgabe in nahezu jedem gewünschten Format. %m
Insbesondere wird der Monat mit Nullen aufgefüllt, was Sie anscheinend auch versuchen.
Kusalananda weist darauf hin:
Noch kompakter (GNU Date und Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
Antwort4
Mit sed könnte es sein
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
Dies wird verwendet ^
, um am Anfang der Zeile zu verankern und dann ein beliebiges einzelnes Zeichen in einer Gruppe zu erfassen, gefolgt von einem Literal und .
dann irgendetwas anderem. Wenn wir das abgleichen, drucken wir ein 0
, dann unsere erste Erfassungsgruppe (das Zeichen am Anfang der Zeile), dann ein und .
dann unsere zweite Erfassungsgruppe (den Rest der Zeile).