${pasteargs// /- } 매개변수 확장이란 무엇을 의미하나요?

${pasteargs// /- } 매개변수 확장이란 무엇을 의미하나요?

문맥:https://stackoverflow.com/a/47348104/15603477

printf -v pasteargs %*s 16
paste -d\  ${pasteargs// /- } < <(seq 1 42)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40 41 42

Paste -d, --delimiters=LIST 탭 대신 LIST의 문자를 재사용합니다.

${매개변수/패턴/문자열}

파일 이름 확장과 마찬가지로 패턴을 확장하여 패턴을 생성합니다. 매개변수가 확장되고 패턴과 해당 값과 가장 오랫동안 일치하는 항목이 문자열로 대체됩니다. 일치는 아래 설명된 규칙에 따라 수행됩니다(패턴 일치 참조). 패턴 b인 경우'/'로 시작하여 일치하는 모든 패턴이 다음으로 대체됩니다. 끈.

안내사항을 확인한 후.

  1. 무엇을 하세요 ${pasteargs// /- }.
  2. %s나는 그 주장이 언급되고 있다는 것을 알고 있습니다 printf. 하지만 %*s 16모르겠어요.
  3. 설명서를 인용했는데도 여전히 잘 모르겠습니다.paste -d\

답변1

  1. printf %*s 16의미: 16칸을 인쇄하세요. 바라보다이 답변추가 설명을 위해. 이제 pasteargs16개의 공백 값을 갖는 변수입니다.

  2. ${pasteargs// /- }의미: 대체하다모두 (공백)이 변수에 발생합니다 -. 즉, 변수의 각 공백 앞에 하이픈을 추가합니다. 매뉴얼에서 인용했듯이 :

    패턴이 "/"로 시작하면 해당 패턴이 모두 문자열로 대체됩니다.

    여기서의 패턴은 /다음을 의미합니다.모두공간 매칭. 따라서 이제 값은 pasteargs공백으로 구분된 16개의 하이픈입니다.

  3. paste명령에 대해 가장 먼저 알아야 할 것은 명령 뒤에 16개의 스트림을 나타내는 16개의 하이픈이 따른다는 것입니다. 기본적으로 16개의 연속 행을 하나의 행으로 병합합니다. 기본적으로 이러한 줄을 병합할 때 다음 구분 기호로 구분됩니다.. 따라서 paste -d\ (백슬래시 뒤의 공백에 주목하세요)는 줄이 다음으로 구분된다는 의미입니다. 공간( \) 바꾸다.

요약하자면, 이 명령(광고된 대로)은 입력의 모든 16개 연속 라인을 공백으로 구분된 하나의 라인으로 병합합니다.

답변2

가장 좋은 방법은 샌드박스(테스트) 환경(가상 머신?)에서 테스트해보고 결과를 확인하는 것입니다. 귀하의 질문은 예시에 제시된 순서를 따르지 않습니다.

  1. man printf:

    필드 너비 ...십진수 문자열 대신..."*"를 쓸 수 있습니다...다음 매개변수에 주어진 필드 너비를 지정하려면...int 유형이어야 합니다.

따라서 printf %*s 16인쇄할 매개변수가 누락된 경우 16개의 공백이 인쇄됩니다.

  1. 이 "매개변수 확장"은 이전에 인쇄된 16개의 공백을 16개의 대시 공백으로 변환합니다.

  2. 찾다

  3. <TAB>이는 기본 구분 기호 대신 이스케이프된 공백일 뿐입니다.

관련 정보