sed 대체 표현식(들여쓰기된 텍스트)에서 수량자를 사용하는 방법은 무엇입니까?

sed 대체 표현식(들여쓰기된 텍스트)에서 수량자를 사용하는 방법은 무엇입니까?

나는 | sed특정 명령의 결과를 들여쓰기 위해 사용합니다(간단한 예를 들어보겠습니다 $ echo something). 결과 앞에 공백 10개를 추가하고 싶습니다. 다음은 잘 작동합니다.

$ echo something | sed 's/^/         /'
         something

| sed그런데 표현식에 수량자를 사용할 수 있는 방법이 있나요 ?

나는 예를 들어 시도했습니다.

$ echo something | sed 's/^/ {10}/'
 {10}something

그러나 분명히 이것은 작동하지 않습니다. {10}수량자로 해석되지 않습니다.

백슬래시로 중괄호를 보호하는 것도 작동하지 않습니다.

$ echo something | sed 's/^/ \{10\}/'
 {10}something

대체 표현식에 수량자를 사용할 수 있는 방법이 있나요?

답변1

교체의 교체가 sed정규 표현식이 아니기 때문에 이것이 가능하지 않다고 생각합니다.

또 다른 방법은 다음과 같이 변수를 생성하여 대체 변수로 사용하는 것입니다.

# use printf to set as many spaces as you want
$ i=$(printf "%10s")

# use the created variable as replacement of the substitution
$ echo something | sed "s/^/$i/"
          something

답변2

좋은 솔루션이 많이 있습니다. 특히 @nezabudka의 | pr -T -o10솔루션이 매우 짧습니다.

이제 재미삼아 " sed유일한" 솔루션을 찾았습니다(no printf, no expand, 아무것도 없음).

$ echo something | sed ':L; /^ \{10\}/! {s/^/ /;b L}'
          something

편집하다:@Barmar의 요청에 따라 몇 가지 설명은 다음과 같습니다.

  • :L;이름이 지정된 태그를 만듭니다 L(원하는 대로 이름을 지정할 수 있음).
  • 줄 시작 부분에 공백을 추가합니다 s/^/ /. 그런 다음 레이블로 돌아갑니다( b L, b레이블로 L약간 a goto).
  • /^ \{10\}/!이 표현식을 조건부로 만듭니다. 행이 10개의 공백( )으로 시작하지 않는 경우에만 실행됩니다.

따라서 기본적으로 줄이 10개의 공백으로 시작될 때까지 "줄의 시작 부분에 공백 추가"를 반복합니다.

@nezabudka의 pr솔루션은 분명히 줄 앞에 공백을 추가하는 가장 간단한 방법이지만 이 sed솔루션은 더 일반적입니다. 예를 들어, XYZ-줄 앞에 5번을 추가합니다.

$ echo something | sed ':L; /^\(XYZ-\)\{5\}/! {s/^/XYZ-/;b L}'
XYZ-XYZ-XYZ-XYZ-XYZ-something

답변3

Perl의 최고의 기능 중 일부는 sed에서 도난당했기 때문에 유사점이 유용할 수 있습니다. 이 경우 Perl 솔루션은 더 간단합니다. 아마도 이런 식으로 생각하면 sed 솔루션이 분명해질 수도 있습니다. 당신이 원하는 것은 10개의 공백을 인쇄하는 것입니다.그런 다음줄을 변환하고 결과를 인쇄하는 대신 출력을 인쇄합니다.

echo something | perl -pe 'print " " x 10'

이 플래그는 명령 끝에 -p암시적으로 추가됩니다 .print $_

정말로 정규식을 사용하고 싶다면 이 /e플래그를 사용하세요

echo something | perl -pe 's/^/" " x 10/e'

교체를 다음과 같이 실행하십시오.실행문결과를 하위 값으로 사용합니다. (이 경우에는 다음을 사용하여 10을 얻습니다)반복 연산자, x)

답변4

쉘이 10개의 공백 시퀀스를 생성하도록 할 수 있습니다.

예를 들어 다음과 같습니다 zsh.

$ echo something | sed "s/^/${(l[10])}/"
          something

여기서 l매개변수 확장 플래그는 eft 패딩을 사용한 빈 매개변수 확장에 적용됩니다. r여기서 오른쪽에 있는 것을 사용할 수도 있습니다 . 다양한 문자로 채우기:

$ echo something | sed "s/^/${(l[10][.])}/"
..........something

짝수 문자 시퀀스:

$ echo something | sed "s/^/${(l[10][<>])}/"
<><><><><>something

관련 정보