Sed는 줄에서 모든 시작 패턴 일치를 제거합니다


11

다음 줄이 있습니다.

abababtestab

줄의 시작 부분에서 sed발생하는 모든 항목을 제거 하는 표현식 을 파악하려고 ab하므로 변환 된 줄은 다음과 같아야합니다.

testab

나는 이것이 간단해야한다고 생각하지만 실제로는 아무것도 모른다 sed.

내가 지금까지 가지고있는 것은 :

sed 's/^ab//'

그러나 이것은 ab의 첫 번째 항목 만 제거합니다.

답변:


16
sed 's/^\(ab\)*//' <in >out

그룹화해야합니다.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

그러나 일부 오래된 seds 는 잘 처리하지 못할 수 있습니다. 하위 표현식 복제는 BRE 의 POSIX 지정 기능이지만 일부 sed는이를 제대로 지원하지 않습니다. 하지만 그 중 일부에서는 ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... 대신 작동 할 수 있습니다.


정확히 내가 찾던 것은 감사합니다! (가능한 한 답변으로 표시하겠습니다)
Dan

sed1979 년경의 7th Edition조차도 그것을 지원했습니다. 그룹화를 처리하지 않으려면 열등한 모방이어야합니다.
Jonathan Leffler

@JonathanLeffler-POSIX 정규 표현식 근거를 참조하십시오 . 아마도 가정일지도 모르지만 거기에 단락이 있습니다. 표준 개발자는 공통적 인 역사적 행동을 고려 \n*했지만 지원 하지는 않았습니다 \n\{min,max\}. \(...\)*, 또는 \(...\)\{min,max\}, 특정 구현의 의도하지 않은 결과로, 하위 표현식 및 역 참조에 따른 복제 및 간격 표현식을 모두 지원했습니다.
mikeserv

@JonathanLeffler : 또한 가보 툴 체츠의 sed 버전에서는 작동하지 않습니다.
cuonglm

@cuonglm- \(ab\)\1*버전은 기본 가보로 작동 sed하고 \(ab\)*버전은 SuSv4 가보로 작동합니다 sed. 적어도 내 빌드에는 해당됩니다. 분명히, 나는 musl lib C에 대해 내 가보 세트를 만들었으므로 그것이 다르게 행동 할 수 있다고 상상할 수 있습니다. 그러나 일반적으로 지정된 기능이 가보 SuSv4 가보 도구에서 작동하지만 기본 도구가 아닌 경우 개발자가 수행했기 때문입니다.
mikeserv

6

다른 sed:

sed -e ':1' -e 's/^ab//;t1'

각 입력 줄마다 label을 설정 :1한 다음 줄 시작 부분에서 substitution 을 수행 ab합니다. 경우 substitution 성공적으로 t레이블 추정 명령 분기 1, 아니 때까지 일을 다시 ab행의 시작에 나타난 패턴, 우리는 완료됩니다.


내 생각과 일치 해. 엄격히 테스트 할 필요는 없다 : s/^ab//; t1충분하다
glenn jackman

@glennjackman : 물론입니다. 업데이트했습니다!
cuonglm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.