[완료] 특정 문자열을 포함한 라인부터 위에 4줄을 삭제하는 것을 찾고 있습니다.

nahanstar의 이미지

지금 쉘 스크립트를 작성하고 있는데요..

특정 문자열을 포함한 라인부터 위에 4줄을 삭제하는 것을 찾고 있습니다.

물론 sed를 이용하여 특정 문자열을 포함한 라인만 지우는 것은 알고 있습니다.

그런데 특정 문자열을 포함한 라인부터 ~ 다중라인을 지우는 것을 어떻게 해야할지 모르겠네요..

sed에 특정 옵션이 있는지? , 아니면 다른 방법을 이용하면 되는지??

알고 싶습니다. 답변 부탁드릴께요.

예제) 대략 이런 패턴에서.. SQL_NOCAHE를 포함한 위로 4개의 라인을 삭제하고 싶습니다.

# Time
# User@Host
# Query_time
SELECT /*!40001 A
# Time
# User@Host
# Query_time
SELECT /*!40001 SQL_NO_CACHE */
# Time
# User@Host
# Query_time
SELECT /*!40001 B
# Time
# User@Host
# Query_time
SELECT /*!40001 C

planetarium의 이미지

더 좋은 방법이 있겠지만, 예전엔 grep으로 줄 번호를 구한 후 head, tail 을 조합해서 처리했던 적이 있습니다. 물론 느립니다...

qiiiiiiiip의 이미지

더 좋은 방법이 있겠지만,
sed를 쓰면 matched된 라인 이후를 지우는 것은 쉽습니다.

cat input.txt | sed '/PATTERN/,+2d' -> PATTERN이후 2줄 삭제 (총3줄)

이걸이용해서 matched된 라인 이전 4줄을 지우려면,

tac input.txt | sed '/PATTERN/,+3d' | cat

이렇게 하면 될것 같네요..

grep의 -v 옵션과, -A, -B, -C 옵션을 같이 써서 되면 좋은데,

이건 grep에서 지원을 안하는듯..

Prentice의 이미지

ex 에디터를 쓰는 게 제일 낫지 않을까요?

g/pattern/-4,-1d

대충 이런 식??

Prentice의 이미지

패턴도 지우시려면

g/pattern/-4,d

nahanstar의 이미지

다시 적용해보고,,, 잘 되는지 말씀드릴께요....

정말 감사합니다. ^^