POSIX 셸에서 문자를 반복하는 방법에 대한 설명이 필요합니다.

POSIX 셸에서 문자를 반복하는 방법에 대한 설명이 필요합니다.

Stack Overflow에 대한 다음 답변은

Bash에서 문자를 반복하는 방법은 무엇입니까?

합리적인 접근 방식을 강요하다POSIX-ly는 아래와 같이 단일 문자를 반복합니다. 이 예에서는 등호를 100번 사용합니다.

printf %100s | tr " " "="

내 문제는 그것이 어떻게 작동하는지 이해하지 못한다는 것입니다. 간단한 설명을 선호합니다. 이런 댓글은 달지 말아주세요설명서를 읽어보세요tr, 제가 ​​똑똑하지 않아서 이런 주장을 하게 되었는데, 그런 printf주장을 사용해 본 적도 본 적도 없어서 이런 질문을 드립니다 .

답변1

즉, printf %100s100개의 공백이 인쇄되어 tr " " "="등호로 변환되므로 효과적으로 100개의 등호가 인쇄됩니다.

그것을 파괴:


printf내장 쉘입니다. 일반적으로 두 개 이상의 매개변수를 사용하며 첫 번째 매개변수는 "형식 문자열"이고 나머지 매개변수는 이 형식 문자열의 자리 표시자를 채우는 데 사용됩니다. 템플릿이 완전히 채워지면 결과가 인쇄됩니다. 인수가 더 있으면 다시 시작하여 더 많은 인수를 채우고 결과 문자열을 인쇄합니다.

에 사용되는 형식 문자열은 printf단일 문자로 시작하고 끝나는 형식 사양을 취하므로 정수(십진수 사용, 따라서 "d")를 나타내고 부동 소수점 숫자를 나타내며 문자열을 나타냅니다. 문자 이외의 다음 문자는 형식 사양의 수정자이며, 특히 출력 중에 요청된 필드 길이를 지정하는 데 사용되는 숫자입니다. 따라서 문자열은 최소 100자 형식으로 지정되며 공백으로 채워지고 왼쪽 정렬됩니다(즉, 문자열 시작 부분에 공백이 추가됩니다).%%d%f%s%%100s

추가 인수가 전달되면 해당 필드에 사용됩니다 %s. 예를 들어 printf %100s abc97개의 공백이 인쇄되고("abc"의 3개를 고려하여 총 100개의 공백) 실제 문자열 "abc"가 표시됩니다. 그러나 인수가 제공되지 않으면 형식 사양은 빈 또는 null 인수로 채워집니다( 의 경우 %s빈 문자열이 되고 의 경우 0이 됩니다 %d등). 따라서 이는 빈 인수를 전달하는 것과 같습니다. 문자열(예: printf %100s ''. 최종 결과는 100자 패딩만 인쇄되는 것입니다.

따라서 모든 것을 합치면 printf %100s100개의 공백이 인쇄됩니다.


Now는 tr문자를 입력에서 출력으로 변환하는 도구입니다. 두 개의 매개변수 SET1과 SET2를 사용하며, 각 매개변수는 문자 집합이며, SET1의 첫 번째 문자를 SET2의 첫 번째 문자로 변환하고, SET1의 두 번째 문자를 SET2의 두 번째 문자로 변환하는 방식입니다. . trstdin에서 입력을 읽고 stdout에 다시 쓰면(따라서 위와 같은 파이프에 유용합니다.) tr항상 주어진 문자열에서 해당 문자의 모든 항목을 변환합니다.

예를 들어 tr aeiou 12345소문자 모음은 1부터 5까지의 숫자로 순서대로 번역되므로 "queueing"은 "q52523ng"로 번역됩니다. tr a-z A-Z소문자를 해당 대문자로 변환하는 등 문자 범위를 전달할 수도 있습니다 .

따라서 tr " " "="전체 문자열의 공백을 등호로 변환하면 됩니다. 매개변수로 인식되려면 첫 번째 공백을 따옴표로 묶어야 합니다. =실제로는 그렇지 않다필요인용되지만 그렇게 해서 나쁠 것은 없습니다. tr " " =같은 효과가 있을 것입니다.


이들을 합치고 100개의 공백을 인쇄한 다음 각 공백을 등호로 변환합니다.

이것이 충분히 자세하게 설명되었으면 좋겠지만, 이해가 안 되는 부분이 있으면 댓글을 남겨주시면 수정하도록 노력하겠습니다.

답변2

printf명령은 다음을 사용합니다.첫 번째 매개변수형식으로후속 매개변수를 인쇄하는 데 사용됩니다. printf %100s공백(왼쪽)으로 채워진 매개변수를 100자 너비로 인쇄합니다. 형식에 대한 인수가 제공되지 않으므로 빈 문자열을 한 번 형식화하고 100개의 공백을 출력합니다. 너는 볼 수있어:

$ printf %100s | hexdump -C
00000000  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00000064

(20은 공백의 16진수 표현입니다. *이전 줄을 반복한다는 의미입니다.)

형식 문자열은 대략 C Xprintf지정자: %, 형식화된 값을 수용하기 위한 선택적 너비 및 사용할 형식 유형을 사용합니다. s문자열 형식이며 기본적으로 문자열 왼쪽에 공백이 채워져 있습니다. 여러 형식이나 기타 텍스트 부분이 있을 수 있습니다. printf "a%10sb\n" hello인쇄

 a         xb.

tr표준 입력에서 선택한 문자를 선택한 대체 문자로 바꿉니다.을 실행하고 결과를 표준 출력으로 인쇄합니다. tr " " "="대체할 문자는 하나(공백)이고 대체할 문자는 하나(등호)입니다. 따라서 입력의 모든 공간을 변환 =하고 나머지는 변경하지 않습니다. 다음을 시도해 볼 수도 있습니다.

$ tr " " "="
hello world
hello=world

(저는 "hello world"를 입력했습니다)

여러 대체를 수행할 수 있습니다. tr abc defa를 d로, b를 e로, c를 f로 변경하고 나머지는 변경하지 않고 그대로 둡니다. 여기서는 printf저렴하게 생성할 수 있으므로 문자 하나만 사용합니다 .

파이프라인 |이유왼쪽 명령의 출력은 printf %100s오른쪽 명령의 입력으로 사용됩니다 tr " " "=". 즉, 100개의 연속된 공백이 주어지면 tr각 공백을 로 바꾸고 =새 문자열을 인쇄합니다.

printf %100s | tr " " "="
====================================================================================================

관련 정보