Gibt es einen Befehl oder eine Reihe von Befehlen, mit denen ich Textzeilen an einem beliebigen Zeichen horizontal ausrichten kann? Bei einer Liste von E-Mail-Adressen würde die Ausgabe beispielsweise eine Textdatei mit allen vertikal angeordneten '@'-Zeichen erzeugen.
Um erfolgreich zu sein, muss am Anfang der meisten Zeilen eine variable Anzahl von Leerzeichen eingefügt werden. Ich möchte keine separaten Spalten, da das Lesen von ihnen mehr Aufwand erfordert (z. B. column -t -s "@" < file.txt
).
Vor:
[email protected]
[email protected]
[email protected]
Nach:
[email protected]
[email protected]
[email protected]
Anders ausgedrückt: Kann ich ein Zeichen als Ankerpunkt angeben, um den der umgebende Text horizontal zentriert ist? Mein Anwendungsfall hierfür sind E-Mail-Adressen, um das visuelle Scannen zu vereinfachen.
text-processing
command-line
Tom Brossman
quelle
quelle
@
Symbole vorhanden sind ?@
Symbole sollten kein Problem mit E-Mail-Adressen sein, aber ein Benutzer sollte in der Lage sein, die Instanz eines Zeichens pro Zeile als "Anker" auszuwählen, um den der andere Text zentriert ist.@
In E-Mail-Adressen sind mehrere Symbole zulässig, ztom"@brossmann"@example.com
. Deshalb habe ich gefragt, was passieren soll, wenn es mehrere@
Symbole gibt :).@
Symbole sind in einer Vielzahl von E-Mail-Diensten nicht zulässig. Es ist völlig vernünftig, "normale" E-Mails zu erwarten, die einem strengeren Standard entsprechen als die "echten", es sei denn, Sie haben es mit rohen, ungefilterten Benutzereingaben zu tun@
.Antworten:
NEIN Awk. Nur
sed
undcolumn
:Ausgabe:
Nun, ich denke darüber nach, das ist fast das Gleiche wie die Lösung von Sundeep, sie sieht nur kürzer aus / hat weniger Anrufe
sed
und es wird auch angenommen, dass@
dies in jeder Zeile nur einmal vorkommt.quelle
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
Im einfachsten Fall können Sie einfach das erste Feld in einer angemessen großen Feldbreite drucken, z
AFAIK Für jede Methode, die keine bestimmte maximale Feldbreite annimmt, muss die Datei entweder im Speicher gehalten oder zwei Durchgänge ausgeführt werden.
quelle
cw=$(cut -d@ -f1 file | wc -L)
und dannawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt
. Der Rest wurde gut formatiert, aber einige Daten fehlen.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
hackige Lösung, setzt viel über Eingabetext voraus
quelle
Eine schnelle Python-Lösung, die die kürzestmögliche Abstandslänge verwendet und alle Zeichenfolgen links vom Trennzeichen rechts ausrichtet:
Verwendung:
quelle
Eine andere GNU
awk
+column
-Lösung:Die Ausgabe:
quelle
Dies kann auch mit der Manipulation von Bash-Strings funktionieren.
Bash-Skript (4.x):
Das Ergebnis:
quelle