나는 | 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
약간 agoto
). /^ \{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