Ich habe eine lange Zeile, in die ich alle 4 Zeichen ein Leerzeichen einfügen möchte, um das Lesen zu vereinfachen. Wie geht das am einfachsten? auch sollte ich in der Lage sein, die Linie von einem Rohr einzugeben. z.B
echo "foobarbazblargblurg" | <some command here>
gibt
foob arba zbla rgbl urg
command-line
shell
text-processing
Xenoterracid
quelle
quelle
sed
Ich fluchte , das war so nah an dem, was ich zuerst versucht hatte, dass ich mich selbst treten konnte.'s/.\{4\}/& /g;s/ $//'
Sie können das folgende einfache Beispiel verwenden:
quelle
sed
Antwort. Ich wusste esfold
vorher nicht.fold
funktioniert es mit aktuellen GNU-Versionen nicht mit Mehrbyte-Zeichen (wieecho €€€€€€€€ | fold -w4 | paste -sd' ' -
in UTF-8).Hier ist das Beispiel mit
grep
undxargs
:quelle
xargs
Läuftecho
standardmäßig, daher funktioniert es-nen
je nachecho
Implementierung nicht mit Wörtern wie oder mit Backslashes . Ab und zu wird auch ein ungerades Zeilenumbruchzeichen angezeigt, wenn xargs mehr als eins ausführtecho
. Besser zum Pfeifenpaste -sd ' ' -
. Beachten Sie, dass dies-o
keine Standardoption ist.Nur in Bash, keine externen Befehle:
oder als Einleitungsversion:
Dies funktioniert, indem jedes Zeichen der Zeichenfolge in ein "(.)" Konvertiert wird, um eine Übereinstimmung mit
=~
dem regulären Ausdruck und eine Erfassung mit ihm zu erzielen. Anschließend werden nur die erfassten Ausdrücke aus demBASH_REMATCH[]
Array ausgegeben , die nach Bedarf gruppiert sind. Führende / nachfolgende / Zwischenräume bleiben erhalten, entfernen Sie die Anführungszeichen, um"${BASH_REMATCH[@]:1}"
sie wegzulassen.Hier ist es in eine Funktion eingeschlossen, diese verarbeitet ihre Argumente oder liest stdin, wenn es keine Argumente gibt:
Sie können die Anzahl einfach parametrisieren, um die Formatzeichenfolge entsprechend anzupassen.
Ein abschließendes Leerzeichen wird hinzugefügt. Verwenden Sie zwei
printf
anstelle von einem, wenn dies ein Problem ist:Der erste
printf
druckt (bis zu) die ersten 4 Zeichen, der zweite druckt bedingt den gesamten Rest (falls vorhanden) mit einem führenden Leerzeichen, um die Gruppen zu trennen. Der Test ist für 5 Elemente, nicht für 4, um das nullte Element zu berücksichtigen.Anmerkungen:
printf
‚s%c
statt verwendet werden könnte%s
,%c
(vielleicht) macht die Absicht klarer, aber es ist nicht Mehrbytezeichensatz sicher. Wenn Ihre Version von bash in der Lage ist, sind alle oben genannten Zeichen mehrbyte-sicher.printf
Formatzeichenfolge so lange, bis die Argumente aufgebraucht sind. Daher werden nur 4 Argumente gleichzeitig verschlungen und die nachfolgenden Argumente verarbeitet.BASH_REMATCH[0]
ist die gesamte übereinstimmende Zeichenfolge, daher wird nur ab Index 1 ausgegebenprintf -v myvar ...
stattdessen, um in einer Variablen zu speichernmyvar
(vorbehaltlich des üblichen Leseschleifen- / Subshell-Verhaltens).printf "\n"
bei Bedarf hinzufügenSie können das oben beschriebene Ergebnis erzielen, indem
zsh
Sie das Arraymatch[]
anstelle von verwendenBASH_REMATCH[]
und 1 von allen Indizes subtrahieren, dazsh
kein 0-Element für die gesamte Übereinstimmung beibehalten wird.quelle
Mit
zsh
nur:Oder
mit
ksh93
nur:Nur mit einer POSIX-Shell (auch das nachfolgende Leerzeichen vermeiden, wenn die Eingabelänge ein Vielfaches von 4 ist):
Nun, das ist für Charaktere . Wenn Sie es auf Graphem-Clustern machen möchten (zum Beispiel, um zu brechen
Stéphane
, geschrieben als$'Ste\u0301phane'
, alsStép hane
und nichtSte phan e
), mitzsh
:Mit ksh93 könnten Sie auch nach der Anzeigebreite aufteilen, was für die
Stéphane
oben genannten Fälle hilfreich wäre , aber auch, wenn andere Arten von Zeichen mit null oder doppelter Breite betroffen sind:quelle
Ich werde nur die erforderlichen Leerzeichen einfügen, damit mindestens alle 4 Zeichen in einer Zeile ein Leerzeichen erscheint. Ich bin mir nicht sicher, wie ich mit diesem Fall umgehen soll. Wenn Sie beispielsweise "aa bbccdd" eingeben, erhalten Sie die Ausgabe "aa bbcc dd" und nicht "aa b bccd d".
Ich verwende Perl für Lookahead, bin aber mit Perl im Allgemeinen nicht sehr vertraut, daher sind möglicherweise Optimierungen erforderlich:
quelle
Ich habe dies mit Python gemacht
Zuerst lese ich eine Datei, dann teile ich durch 4 Zeichen und füge Leerzeichen hinzu
/root/l.txt ==> Besteht aus dem Inhalt, den Sie im Beispiel angegeben haben
Ausgabe
quelle