Bash dodaje końcowe spacje, aby uzasadnić ciąg


20

Mój obecny kod wygląda następująco: x=${y:0:40}co ogranicza długość łańcucha do 40 znaków. Czy w przypadku ciągów krótszych niż 40 znaków można wypełnić końcowe miejsca spacjami?

Więc jeśli mój y="very short text"

Chciałbym, aby mój y był:

y = „bardzo krótki tekst (+25 spacji końcowych)

Odpowiedzi:


20

Jeśli wszystkie te znaki są jednobajtowe, to znaczy, jeśli znajdujesz się w lokalizacji, w której zestaw znaków jest jednobajtowy (jak iso8859-1) lub jeśli zestaw znaków w lokalizacji jest UTF-8, ale tekst jest tylko ASCII, możesz to zrobić :

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

Obejmuje to zarówno obcinanie, jak i padding.

Jeśli nie, zawsze możesz dodać 40 spacji i zastosować swoje ${y:0:40}podejście.

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

zsh ma dedykowanych operatorów dla lewej i prawej wyściółki:

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

(także obcinanie). zsh„s printfliczy się w znaki zamiast bajtów, więc nie miałby bash” s problem powyżej. Pamiętaj jednak, że zshdo tej -vopcji potrzebujesz 5.3 lub nowszej wersji .

Zobacz także tę odpowiedź na powiązane pytanie, aby uzyskać więcej informacji, jeśli napotkasz postacie, które nie mają tej samej szerokości.


14

Powinieneś spróbować printf:

printf '%-40s' "$y"

10

Czysty bash:

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

Metoda polega na dodaniu 0-40 spacji do każdego łańcucha po obcięciu go.

Dane wyjściowe (zwróć uwagę na pozycje pojedynczego cudzysłowu):

'very short text                         '

1
Wolałbym użyć tej metody, ponieważ będzie ona działać bezpośrednio na zmiennych i nie będzie wymagała danych wyjściowych.
David Tabernero M.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.