코드 생성기의 출력을 정리하려고 합니다. 불행히도 여러 가져오기가 생성됩니다.
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