printf를 사용하여 문자를 반복하고 끝에 개행 추가

printf를 사용하여 문자를 반복하고 끝에 개행 추가

문자를 N번 반복하려면 를 사용할 수 있습니다 printf. 예를 들어 20번 반복하려면 @다음과 같이 사용할 수 있습니다.

N=20
printf '@%.0s' $(seq 1 $N)

산출:

@@@@@@@@@@@@@@@@@@@@

그러나 해당 문자열 끝에는 개행 문자가 없습니다. 출력을 다음으로 파이핑해 보았습니다 sed.

printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'

printfsed를 사용하지 않고 단일(출력 끝에 개행 문자 추가) 로 동일한 결과를 얻을 수 있습니까 ?

답변1

printf %.1s @{1..20} $'\n'

쉘은 먼저 중괄호를 확장합니다. 이를 "보조 확장"이라고 합니다.
@{1..20}into @1 @2 @3 ...등 그런 다음 1바이트(개행 문자)로 구성된
마지막 인수를 포함하여 각 매개변수의 첫 번째 바이트가 출력됩니다.$'\n'

답변2

와 함께 zsh:

printf '%s\n' ${(l[20][@])}

( l왼쪽 패딩을 사용하여매개변수 확장 플래그. 여기서는 ight padding을 사용할 수도 있습니다 r.

물론 꼭 사용할 필요는 없습니다 printf. 기본적으로 a를 추가하는 print또는 여기를 사용할 수도 있습니다 . ( 또는 로 쓸 수 있지만 , 백슬래시를 포함하지 않고 로 시작하지 않으면 / 로 단순화할 수 있습니다 ).echo\nprintf '%s\n' "$string"print -r -- "$string"echo -E - "$string"zsh$string-print "$string"echo "$string"

최종 목표가 화면 너비에 맞게 채워진 문자열 목록을 표시하는 것이라면 다음을 수행합니다.

$ lines=(short 'longer text' 'even longer')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ even longer
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
even longer @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

플래그로 m인해 zsh는 각 문자의 표시 너비를 고려합니다(예: 위의 이중 너비 문자(브라우저는 정확히 이중 너비로 렌더링되지 않을 수 있지만 터미널에서는 그래야 함)).

print -rC1 --printf '%s\n'또는 print -rl --인수가 전달되지 않는 경우(예: when )를 제외하고 한 줄에 하나의 요소를 인쇄하는 것과 같습니다 lines=(). 이 경우 빈 줄 대신 아무것도 인쇄하지 않습니다.

답변3

나는 이것을 스크립트에서 사용합니다. printf '%150s\n' | tr ' ' '@'

답변4

1년 전의 원본 게시물에 대한 솔루션:

printf를 사용하여 문자를 반복하고 끝에 개행 추가

printf '@%.0s' $(seq 1 $N); echo

다른 사람이 동일하거나 유사한 문제를 겪고 있는 경우를 대비해.

관련 정보