Bash füge nachgestellte Leerzeichen hinzu, um die Zeichenkette zu rechtfertigen

20

Mein aktueller Code sieht folgendermaßen aus:, x=${y:0:40}wodurch die Länge der Zeichenfolge auf 40 Zeichen begrenzt wird. Ist es möglich, die nachstehenden Stellen mit Leerzeichen zu füllen, wenn die Zeichenfolge kürzer als 40 Zeichen ist?

Also wenn meine y="very short text"

Ich möchte, dass mein y ist:

y = "sehr kurzer Text (+25 nachgestellte Leerzeichen) "

user222977
quelle

Antworten:

19

Wenn diese Zeichen nur aus einem Byte bestehen, dh wenn Sie sich in einem Gebietsschema befinden, in dem der Zeichensatz aus einem Byte besteht (z. B. iso8859-1), oder wenn der Zeichensatz des Gebietsschemas UTF-8 ist, der Text jedoch nur ASCII-Zeichen enthält, können Sie dies tun :

printf -v y %-40.40s "$y"

Dies deckt sowohl das Abschneiden als auch das Auffüllen ab.

Wenn nicht, können Sie immer 40 Leerzeichen hinzufügen und Ihren ${y:0:40}Ansatz verwenden.

printf -v pad %40s
y=$y$pad
y=${y:0:40}

zsh hat spezielle Operatoren für die linke und rechte Polsterung:

y=${(r:40:)y}

(Macht auch Kürzung). zsh's printfzählt in Zeichen anstelle von Bytes, hätte also oben kein bashProblem. Beachten Sie jedoch, dass Sie zsh5.3 oder neuer für die -vOption benötigen .

Weitere Informationen finden Sie auch in dieser Antwort auf eine verwandte Frage, wenn Sie mit Zeichen konfrontiert sind, die nicht alle die gleiche Breite haben.

Stéphane Chazelas
quelle
14

Sie sollten versuchen printf:

printf '%-40s' "$y"

quelle
10

Pure bash:

ten="          " 
forty="$ten$ten$ten$ten" 
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"

Die Methode besteht darin, jeder Zeichenfolge nach dem Abschneiden 0-40 Leerzeichen hinzuzufügen.

Ausgabe (beachten Sie die einfachen Anführungszeichen):

'very short text                         '
agc
quelle
1
Ich würde diese Methode lieber verwenden, da sie direkt auf Variablen angewendet werden kann und nicht ausgegeben werden muss.
David Tabernero M.