첫 번째 패턴을 제외한 모든 패턴을 제거합니다.

첫 번째 패턴을 제외한 모든 패턴을 제거합니다.

코드 생성기의 출력을 정리하려고 합니다. 불행히도 여러 가져오기가 생성됩니다.

import Foo
...
import Foo

다행스럽게도 생성된 텍스트는 자주 재생성되지만 상대적으로 정적이므로 쉽게 제거할 수 있는 방법이 있기를 바랍니다.

나는 그들이 같은 줄에 있다면 다음을 할 수 있다는 것을 알았습니다.sed 's/import Foo//2g'

그러나 나는 모든 행을 고려하도록 sed에 대해 충분히 알지 못합니다.

해키 솔루션은 여러 개의 sed를 실행하는 것입니다.

sed 's/\n/<string I know doesn't appear>/g'
sed 's/import Foo//2g'
sed 's/<string I know doesn't appear>/\n'

하지만 그렇게 하는 것은 잘못된 것 같았습니다. 더 좋은 방법이 있나요?

답변1

sed '/^import Foo$/{x;/^$/!d;g;}'

작동 방식: 패턴과 일치하는 모든 줄에서

  • x: 예약된 공간으로 행을 교환합니다.
  • /^$/!d: 방금 저장공간에서 얻은 컨텐츠가 비어있지 않은 경우입니다. 이전 일치 항목이 거기에 저장되어 있으므로 패턴을 삭제하고 다음 줄로 진행합니다.
  • g: 그렇지 않은 경우(즉, 첫 번째 통과) 저장된 행을 다시 복사합니다. 기본적으로 인쇄됩니다.

답변2

GNU 구현 sed(이미 GNUism을 사용하고 있기 때문에 아마도 사용 중일 것임 2g)을 사용하여 다음을 수행할 수 있습니다.

sed '0,/import Foo/!{//d}' < file

import Foo첫 번째 행을 제외한 모든 행이 삭제됩니다. /^import Foo$/다음 기준과 일치하는 행만 삭제하려면 패턴을 다음으로 바꾸세요.정확히 import Foo.

여기 에서도 사용할 수 있습니다 awk:

awk '!/import Foo/ || !n++' < file

답변3

귀하의 sed버전에서 허용한다면 시도해보십시오.

sed -z 's/import Foo//2g' file

답변4

간단하고 이식 가능하도록 유지하고 awk를 사용해야 합니다.

$ cat file
import Foo
import Bar
import More
import Foo
import Stuff
import Bar

$ awk '!seen[$0]++' file
import Foo
import Bar
import More
import Stuff

또는 고유하게 만들고 싶은 줄로 시작 import하고 입력에 건드리고 싶지 않은 다른 줄이 있는 경우:

$ cat file
import Foo
int 3;
import Bar
char 7;
import More
int 3;
import Foo
char 7;
import Stuff
whatever
import Bar
whatever

$ awk '!(/^import/ && seen[$0]++)' file
import Foo
int 3;
import Bar
char 7;
import More
int 3;
char 7;
import Stuff
whatever
whatever

관련 정보