패딩 중심 정렬을 사용하여 변수를 인쇄하는 방법은 무엇입니까?

패딩 중심 정렬을 사용하여 변수를 인쇄하는 방법은 무엇입니까?

$myvar패딩을 터미널 중앙에, 양쪽이 =화면 가장자리에 오도록 인쇄하려면 어떻게 해야 합니까 ?

답변1

나는 이 가능한 답을 찾는 데 도움이 되는 두 가지 정보를 stackexchange 네트워크에서 찾았습니다.

그러나 이 답변의 코드는 내 코드입니다.

더 자세한 내용을 원하시면 편집 기록을 참조하세요. 난센스와 "단계별 단계"를 모두 제거했습니다.


가장 좋은 방법은 다음과 같습니다.

center() {
  termwidth="$(tput cols)"
  padding="$(printf '%0.1s' ={1..500})"
  printf '%*.*s %s %*.*s\n' 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
}
center "Something I want to print"

터미널 80열 출력:

========================== Something I want to print ===========================

패딩은 단일 문자일 필요는 없으며 단일 문자일 수도 있습니다. 실제로 padding변수는 그렇지 않습니다. 위 코드에서는 길이가 500자입니다. 행만 변경하여 다른 형태의 패딩을 사용할 수 있습니다 padding.

padding="$(printf '%0.2s' ^v{1..500})"

결과 :

^v^v^v^v^v^v^v^v^v^v^v^v^v Something I want to print ^v^v^v^v^v^v^v^v^v^v^v^v^v^

또 다른 편리한 용도는 다음과 같습니다.

clear && center "This is my header"

답변2

그리고 zsh:

$ var='some text'                                                              |
$ print -r - ${(l[COLUMNS/2][=]r[COLUMNS-COLUMNS/2][=])var}                    |
===================================some text===================================|

왼쪽 패드와 오른쪽 패드의 열 수는 =터미널의 절반입니다. 이 m플래그를 사용하면 너비가 0이거나 너비가 2개인 문자가 있는 경우 패딩에서 문자 너비를 고려합니다 $var.

bashGNU를 사용하면 wc같은 일을 할 수 있습니다:

var='some text'
width=$(wc -L <<< "$var")
printf -v pad "%$(( (COLUMNS - width) / 2 ))s"
pad=${pad// /=}
printf '%s%.*s\n' "$pad$var$pad" "$(((COLUMNS-width)%2))" =

wc -L우리는 디스플레이 너비를 얻기 위해 GNU를 사용합니다 $var. width=${#var}이는 문자열에 단일 너비 문자만 포함된 경우에 작동합니다.

어떤 경우에도 $var이러한 가정에는 제어 문자(TAB, NL, CR, 컬러 이스케이프 시퀀스 등 포함)가 포함되지 않습니다.

답변3

이 제안은 실용적으로 보이지만 터미널이 terminfo 함수 cols, hpa, ech, cufcud1cf를 지원한다는 의미입니다.산출(1),용어 정보(5),정보 CMP(1m).

#!/bin/bash

# Function "center_text": center the text with a surrounding border

# first argument: text to center
# second argument: glyph which forms the border
# third argument: width of the padding

center_text()
{
    local terminal_width=$(tput cols)    # query the Terminfo database: number of columns
    local text="${1:?}"                  # text to center
    local glyph="${2:-=}"                # glyph to compose the border
    local padding="${3:-2}"              # spacing around the text

    local border=                        # shape of the border
    local text_width=${#text}

    # the border is as wide as the screen
    for ((i=0; i<terminal_width; i++))
    do
        border+="${glyph}"
    done

    printf "$border"

    # width of the text area (text and spacing)
    local area_width=$(( text_width + (padding * 2) ))

    # horizontal position of the cursor: column numbering starts at 0
    local hpc=$(( (terminal_width - area_width) / 2 ))

    tput hpa $hpc                       # move the cursor to the beginning of the area

    tput ech $area_width                # erase the border inside the area without moving the cursor
    tput cuf $padding                   # move the cursor after the spacing (create padding)

    printf "$text"                      # print the text inside the area

    tput cud1                           # move the cursor on the next line
}

center_text "Something I want to print" "~"
center_text "Something I want to print" "=" 6

다음 제안은 @보다 더 강력하고 확장 가능하며 명확합니다.와일드카드~의해결책.

#!/bin/bash

# Function "center_text": center the text with a surrounding border

# first argument: text to center
# second argument: glyph which forms the border
# third argument: width of the padding

center_text()
{

    local terminal_width=$(tput cols)     # query the Terminfo database: number of columns
    local text="${1:?}"                   # text to center
    local glyph="${2:-=}"                 # glyph to compose the border
    local padding="${3:-2}"               # spacing around the text

    local text_width=${#text}             

    local border_width=$(( (terminal_width - (padding * 2) - text_width) / 2 ))

    local border=                         # shape of the border

    # create the border (left side or right side)
    for ((i=0; i<border_width; i++))
    do
        border+="${glyph}"
    done

    # a side of the border may be longer (e.g. the right border)
    if (( ( terminal_width - ( padding * 2 ) - text_width ) % 2 == 0 ))
    then
        # the left and right borders have the same width
        local left_border=$border
        local right_border=$left_border
    else
        # the right border has one more character than the left border
        # the text is aligned leftmost
        local left_border=$border
        local right_border="${border}${glyph}"
    fi

    # space between the text and borders
    local spacing=

    for ((i=0; i<$padding; i++))
    do
        spacing+=" "
    done

    # displays the text in the center of the screen, surrounded by borders.
    printf "${left_border}${spacing}${text}${spacing}${right_border}\n"
}

center_text "Something I want to print" "~"
center_text "Something I want to print" "=" 6

답변4

당신은 이것을 할 수 있습니다

WIDTH=$(tput cols)
WIDTHDIVIDED=$(($WIDTH/2)) # Solves "tput cols divided by 2"
clear
tput cup 0 $WIDTHDIVIDED # Puts the start of the PS1 at column 0 and the terminal width divided by two

도움이 되길 바랍니다.

관련 정보