Aktuellen Tag mit cal ausgeben

7

Ich werde gebeten, den aktuellen Tag mit dem calBefehl auszugeben .

Bisher habe ich festgestellt, dass es vor dem aktuellen Datum eine gibt _ Symbol gibt. Ich habe mich für grephier entschieden cal | grep '\b_*':, aber es gibt die ganze Woche aus. Ich habe mehrere Varianten ausprobiert, aber es hat nicht geklappt.

Eigentlich gibt es auch einen Fall, in dem der aktuelle Tag nur eine Ziffer hat, also muss ich ihn tr -d ' 'hier verwenden.

Ich habe keine Ahnung, wie ich all diese Befehle miteinander kombinieren soll.

Welez
quelle

Antworten:

8

Wenn die Ausgabe des calBefehls kein Terminal ist, wird die Unterstreichung des armen Mannes auf die Tageszahl für heute angewendet, die darin besteht, vor jedem Zeichen einen Unterstrich und ein Rücktastezeichen zu setzen, um sie zu unterstreichen. Sie können dies sehen, indem Sie die Zeichen visuell anzeigen ( ^Hbedeutet Steuerelement-H , das Rücktaste-Zeichen):

cal | cat -A
cal | cat -vet

oder indem Sie sich einen Hex-Dump ansehen:

cal | hd
cal | od -t x1

Sie müssen also die unterstrichenen Zeichen erkennen und ausgeben.

Mit GNU grep können Sie auf einfache Weise alle Übereinstimmungen eines regulären Ausdrucks drucken: Verwenden Sie die -oOption. Ein Unterstreichungszeichen wird durch den erweiterten regulären Ausdruck abgeglichen, _^H.wobei ^Hes sich um ein wörtliches Rücktastezeichen handelt, nicht um die beiden Zeichen ^und H, und .das zu druckende Zeichen. Anstatt das Rücktastezeichen einzugeben, können Sie sich darauf verlassen, dass nur so Unterstriche in der Ausgabe verwendet werden. Es reicht also aus, die Unterstriche zu erkennen und die Rückräume als nicht übereinstimmende Zeichen zu belassen.

cal | grep -o '_..'

Wir sind nah dran, aber die Ausgabe enthält die Unterstrich-Backslash-Sequenz und die Ziffern stehen in separaten Zeilen. Sie können alle nichtstelligen Zeichen entfernen (und eine nachfolgende neue Zeile hinzufügen):

cal | grep -o '_..' | tr -d 0-9; echo

Alternativ können Sie das Muster wiederholen _.., um mehrere unterstrichene Ziffern abzugleichen. Dadurch bleibt die Unterstreichung in der Ausgabe erhalten. Sie können tr oder sed verwenden, um sie zu entfernen.

cal | grep -E -o '(_..)*'
cal | grep -E -o '(_..)*' | tr -d '\b_'
cal | grep -E -o '(_..)*' | sed 's/_.//g'

Sie können dies mit sed tun, aber es ist nicht ganz einfach. Sed bietet eine einfache Möglichkeit, nur übereinstimmende Zeilen zu drucken (verwenden Sie die -nOption, um nur Zeilen abzurufen, die explizit gedruckt werden), aber keine direkte Möglichkeit, mehrere Vorkommen einer Übereinstimmung in einer Zeile zu drucken. Eine Möglichkeit, dies zu lösen, besteht darin, die Tatsache auszunutzen, dass höchstens zwei unterstrichene Zeichen vorhanden sind und einen sBefehl zum Transformieren und Ausgeben von Zeilen mit einem einzelnen unterstrichenen Zeichen und einen anderen für Zeilen mit zwei Zeichen haben. Nach wie vor werde ich die Backspaces nicht explizit abgleichen.

cal | sed -n 's/.*_.\(.\)_.\(.\).*/\1\2/p; s/.*_.\(.\).*/\1/p'

Ein alternativer Ansatz mit sed unter der Annahme, dass es nur ein unterstrichenes Segment in einer Linie gibt, besteht darin, alles davor und alles danach zu entfernen.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/p'

Dies hinterlässt die Unterstriche; Wir können sie mit einem dritten Ersatz entfernen.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/; s/_.//gp'
Gilles 'SO - hör auf böse zu sein'
quelle
11

Der richtige Weg, dies zu tun, ist einfach zu verwenden date:

% date +%d
19

Der angezeigte Unterstrich ist kein Unterstrich, sondern ein Steuerzeichen, das von Ihrem Terminal angezeigt wird. Wenn Sie wirklich verwenden möchten cal, müssen Sie herausfinden, was dieses Steuerzeichen ist, und danach suchen. Sie können dies verwenden, indem Sie so etwas wie verwenden cal | xxd.

Ein weiteres Problem besteht darin, dass caldieses Steuerzeichen nur ausgegeben wird, wenn stdout ein tty ist. Sie müssen es also davon überzeugen, dass es eines ist (berücksichtigen Sie scriptdies).

Chris Down
quelle
Wenn es kein Terminal ist, was man bekommt , ist ein Unterstrich, sowie die ältesten Steuerzeichen im Buch: Backspace. Es erzeugt eine unterstrichene "19" als Unterstrich Rückraum 1 Unterstrich Rückraum 9.
Hobbs
1
@hobbs Das bekomme ich unter util-linux 2.29.1 nicht - unter dem aktuellen Datum wird überhaupt nichts ausgegeben, wenn keine Verbindung zu einem TTY besteht.
Chris Down
3

Ich bin im Moment nicht vor einem GNU-Befehl, aber das ist näher an dem, was Sie wollen:

cal | grep -Eo '_[[:digit:]]+' | sed 's/_//'

Der grep -Esagt, dass erweiterte reguläre Ausdrücke erlaubt werden sollen (für die Klasse [[: digit:]]); das-o Flag sagt, dass nur der übereinstimmende Teil ausgegeben werden soll; Der Befehl sed entfernt den Unterstrich.

Das ist der cal + grep-Weg, aber wie Chris sagte , ist der normale Weg, um das aktuelle Datum zu erhalten, der dateBefehl.

Jeff Schaller
quelle
Nicht ganz: Zwischen dem Unterstrich und der Ziffer befindet sich eine Rücktaste.
Gilles 'SO - hör auf böse zu sein'
-1
cal | cat -vet | grep -o "H....." | cut -c 2,6

Einfach und funktioniert gut, obwohl es nicht der beste Weg ist.

Amey Kudari
quelle
Gemeint, um "Formatierung hinzugefügt und einen Satz gemacht" zu sagen, aber falsch geklickt; Ich entschuldige mich für die verstümmelte Bearbeitungszusammenfassung!
Jeff Schaller