sed는 라인에서 모든 시작 패턴 일치를 제거합니다.

sed는 라인에서 모든 시작 패턴 일치를 제거합니다.

다음 줄이 있습니다.

abababtestab

sed줄 시작 부분에 있는 모든 항목을 제거하는 표현식을 찾으려고 노력 중이므로 변환된 줄은 다음과 같아야 합니다.ab

testab

이건 간단해야 할 것 같은데, 사실 난 아무것도 모른다 sed.

내가 지금까지 가지고 있는 것은 다음과 같습니다.

sed 's/^ab//'

그러나 이것은 ab의 첫 번째 발생을 제거합니다.

답변1

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

그룹화해야합니다.

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

testab

일부sed노년​그러나 잘 처리되지 않을 수도 있습니다. 하위 표현식 반복은POSIX 지정BRE 기능을 일부 sed시스템에서는 제대로 지원하지 않습니다. 하지만 그 중 일부에서는...

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

...작동할 수도 있습니다.

답변2

다른 sed:

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

각 입력 줄에 대해 레이블을 설정한 :1다음 줄의 시작 부분에서 교체합니다 s. 대체가 성공 ab하면 est 명령은 레이블을 지정하기 위해 분기 하고 줄 시작 부분에 패턴이 나타나지 않을 때까지 작업을 다시 수행하여 완료됩니다.st1ab

답변3

역방향 문자열을 처리하는 것이 더 쉬울 수도 있습니다. 이렇게 하면 첫 번째 이벤트를 제외한 모든 (역방향) 이벤트를 삭제할 수 있습니다.

$ echo "abababtestab" |
rev | sed 's/ba//2g' | rev
testab

문자열이 패턴으로 시작하지 않는 경우에도 작동합니다.

관련 정보