So formatieren Sie die Skriptausgabe so, dass sie die gleiche Anzahl von Leerzeichen enthält


7

Hier ist mein Skript:

#!/bin/bash
declare -a a=(`ls`)
declare -a b=()
declare -a sorted_arr=()

var =0

while [ -n "${a[$var]}" ]
do

    echo "${a[$var]:0:10}              |"
    var=`expr $var + 1`

done

Dieses Skript erzeugt inkonsistente Abstände

another_fi              |
f2.txt              |
file1.txt              |
file3.txt              |

Ich möchte, dass vertikale Pipelinesymbole ausgerichtet werden

another_fi             |
f2.txt                 |
file1.txt              |
file3.txt              |

2
Können Sie den Code veröffentlichen, anstatt das Bild zu veröffentlichen?
Choroba

3
Bitte lassen Sie die Bilder mit Text fallen, ersetzen Sie sie durch tatsächlichen Text und klären Sie dann, was Sie erreichen möchten. Derzeit gibt es im gesamten Beitrag kein Fragezeichen.
Andrea Lazzarotto

1
Die Formatierung Jungs
behoben

Antworten:


10

Der Hauptgrund ist, dass Ihr Echo-Befehl x Zeichen von Variablen nimmt und 14 Leerzeichen auffüllt. Dies bedeutet, dass die Gesamtzahl der Zeichen im Ausgabezeichenfolgenbereich nicht konsistent ist.

Stattdessen möchten Sie möglicherweise den printfBreitenbezeichner %-10sfür die linke Auffüllung wie folgt verwenden:

bash-4.3$ for i in "${a[@]}"; do     printf "%-10s%-4s|\n"  "${i:0:10}" " "; done
1.wav         |
2.wav         |
3.wav         |
input.txt     |

Auf diese Weise wird jede Variable, die Sie haben, so eingestellt, dass sie in 10 Zeichen passt, und auf diese 10 Zeichen setzen wir das 4. -Zeichen, um jede Zeichenfolge linksbündig zu machen.

Die Nummer -10in %-10ssollte gleich bleiben, um sicherzustellen, dass auch wenn die Datei kürzer als 10 Zeichen ist, eine Zeichenfolge mit 10 Zeichen und aufgefüllten Leerzeichen angezeigt wird. Aber ein %-4sTeil kann variiert werden. Zum Beispiel wird im obigen Beispiel %-4s4 Leerzeichen vorhanden sein, aber wenn wir 14 Leerzeichen haben möchten, verwenden Sie %-14s.


Beachten Sie, dass es generell empfohlen wird , die Ausgabe von ls nicht zu analysieren , was genau das ist, was Sie tun. Alternativ können wir findBefehle mit folgender while IFS= read -r -d ''Struktur verwenden:

bash-4.3$ find -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file;
> do
>     printf "%-10s%-4s|\n"  "${file:0:10}" " "
> done
./3.wav       |
./1.wav       |
./2.wav       |
./.swp        |
./input.tx    |

Beachten Sie, dass dies findrekursiv ist und daher auch in Unterverzeichnissen funktioniert. Wenn Sie dies vermeiden möchten, verwenden Sie die -maxdepth 1Option.

Beachten Sie, dass es findauch eine eigene -printfOption gibt, die effizienter sein kann, um alles über einen Prozess als zwei zu erledigen (das ist findplus die Subshell, in der ausgeführt wird while):

$ find /bin -type f -printf "%-15f|\n" 2>/dev/null | head -n 5
hostname       |
nc.traditional |
fusermount     |
loadkeys       |
zless          |

Im Idealfall würde ich vorschlagen, alles in eine temporäre Datei zu schreiben, die längste Zeile (auch bekannt als längster Dateiname in der Datei) herauszufinden und so viele Leerzeichen wie möglich entsprechend aufzufüllen.


Ich habe es ausgeführt, aber ... Ich möchte drucken, ./3.wav | ./1.wav | ./2.wav | wenn ich ./randomfi nicht einschließen möchte.
SeHoon

OK, ich werde das in einer Minute beheben. Halten Sie auf
Sergiy Kolodyazhnyy

@ 최세훈 Wenn die Antwort Ihre Frage gelöst hat, können Sie meine Antwort als akzeptiert markieren, indem Sie das graue Häkchen an der Seite aktivieren.
Sergiy Kolodyazhnyy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.