grep으로 여러 줄의 매칭은 안 되는 걸까?

CLI // 2026년 06월 25일 작성

grep이라는 도구는 UNIX를 비롯해 리눅스 CLI 파이프라인에서 독보적인 지위를 차지하는 아주 중요한 유틸리티다. 파일 내용이나 텍스트 입력에서 필요한 내용을 찾아 필터링해 주는 중요한 역할이니 당연하다. 더구나 정규표현식까지 지원하기 때문에 상당히 복잡한 패턴 매칭도 가능하다.

앞서 Python Markdown으로 HTML 출력 시 이미지 캡션을 덧붙여주기 기능을 적용한 뒤 급히 해야 할 일이 생겼다. 직접 작성했던 모든 글에서 '수동 이미지 캡션'을 제거해야 했기 때문이다.

이 일의 처리를 위해선 우선 '수동 이미지 캡션'이 들어간 모든 마크다운 파일을 찾아야 했다. 이 수동 이미지 캡션 패턴은 대충 이런 식이었다.

![
*

즉 느낌표와 대괄호가 포함된 라인과 그다음 라인에 별표가 들어간 패턴을 찾으면 된다는 말이다. 이 패턴은 마크다운을 안다면 이미지 문법과 기울어짐(italic) 스타일 문법의 일부라는 것을 익히 알 수 있을 것이다.

어쨌든 그래서 아무 생각 없이 'grep도 여러 줄의 패턴도 인식할 수 있겠지?' 하며 \n을 중간에 넣어서 이런 식으로 커맨드를 입력해 봤다.

grep '!\[.*\\n\*' *.md

그랬더니 성공적으로 아무 일도 일어나지 않았다. 하하 이런. 그러니까 표준(?) grep은 멀티라인 매칭이 안 된다는 말이다.

생각해 보면 \n이라는 개행문자 표시 자체가 정규표현식 하고 잘 안 어울리기도 하는 게 정규표현식에서 백슬래시로 시작하는 표현은 인쇄용 특수 문자가 아니라 다른 여러 패턴으로써의 의미를 가지고 있으니 통하지 않는다고 보는 게 합리적이다. 즉 순수하게 바보짓을 해버렸다.

그래서 못 한다는 말은 아니겠지?

grep으로 안 된다면 다른 도구를 쓰는 방법을 생각해 보는 게 합리적이다. 꼭 해야 할 일을 포기할 순 없으니 말이다. 물론 안 한다고 어딘가 큰 문제가 생기는 건 아니지만 찝찝함이 꽤 크게 남을 것이니 말이다.

이렇게 힌트가 부족할 땐 AI에게 물어보는 게 답이다. 솔직히 검색으론 어떻게 검색하면 좋을지 답도 없고 말이다.

그리하여 멀티 라인 매칭에 대한 여러 접근 방법을 알게 되었다. 그중에서 개인적으론 perl을 이용하는 방법을 시도해 보기로 했다.

참고로 perl은 Perl이라는 언어의 인터프리터인데 자체 정규표현식 기능이 간결하고 강력해서 스크립팅 용도로도 활용되는 도구라 리눅스든 맥이든 터미널에서 풍부하게 활용된다.

perl을 이용해 앞에서 언급한 수동 이미지 캡션 패턴을 검색하기 위해선 이런 식으로 사용할 수 있었다.

perl -0777 -ne 'print if /!\[.*\n\*/' PATH

위 커맨드는 한 파일에서 이미지 수동 캡션 패턴을 검색하는 명령이다. /로 시작해서 /로 끝나는 perl 특유의 정규표현식 문법이 보인다. 참고로 PATH로 표시한 부분에는 당연히 파일 이름이나 파일의 경로가 들어가면 된다.

하지만 위 커맨드는 한계가 있다. 한 파일에서만 검색이 가능하니 말이다. 불행히도 이번에 해야 할 일은 한 파일이 아니라 여러 파일에서 해야 한다는 점이다.

그래서 약간의 변형을 가했다.

perl -0777 -ln -e 'print $ARGV if /!\[.*\n\*/' *.md

위 커맨드는 현재 디렉터리의 모든 .md 파일에서 해당 이미지 수동 캡션 패턴을 검색해 해당하는 파일명을 콘솔에 출력해 주었다.

이 방식은 제대로 동작은 하긴 했다. 다만 다른 문제가 있었다. 파일명이 개행문자 없이 모조리 붙어서 나와서 읽기가 너무 어려웠던 것이다. 아니 노안이 있는 건 사실이지만 그래도 누가 봐도 읽기 힘들었을 거다.

그래서 가독성을 개선하기 위해 각 파일명 뒤에 개행문자를 추가하도록 하고 싶었다. 결국 이런 코드가 탄생하고야 말았다.

perl -0777 -ne 'if (/!\[.*\n\*/) { print "$ARGV\n"; close ARGV; }' *.md

이런 식으로 현재 디렉터리의 모든 .md 파일에서 원하는 이미지 수동 캡션 패턴을 포함하고 있는 파일이 무엇인지 확인할 수 있는 커맨드를 얻을 수 있었다. 이제 파일명 사이에 개행문자도 들어가기 때문에 가독성도 좋아졌다.

단점으로 명령이 제법 길어진 것이 있겠지만 자주 쓸 일도 없을 것 같으니 넘어가도 될 단점 같다.

여담

찾아보면 이 외의 더 좋은 솔루션이 있기는 한 것 같다. 예를 들어 pcregrep 같은 걸 쓰면 쉽게 된다고는 한다. 하지만 Homebrew에서 검색도 안 되고 따로 설치하는 것도 왠지 찝찝하고 너무 귀찮았다.

어쨌든 뭘 쓰든 문제를 해결했으니 된 것 아닌가. CLI(Command Line Interface)나 TUI(Text User Interface)는 이게 참 좋다. 모두 텍스트니 거기에 맞게 입력을 받고 출력을 잘하면 완벽하게 처리된 것이니 말이다.

어쨌든 이렇게 얻은 커맨드로 일일이 수동 이미지 캡션을 제거했다. 하다 보니 이런 일도 또 AI에게 시킬걸 그랬나 하는 생각이 들었다. 하지만 결국 직접 해내고야 말았다. 아마도 걸린 시간은 AI를 통해서 한 거보다 더 빠르지 않았을까 생각되기도 했다. 뭐 잘한 거라고 생각하자. AI 클라우드 전기료도 좀 아꼈으니 환경에도 좋은 일을 한 거다.

Seorenn Logo
Seorenn (Konrad Seo)
개발자 주제에 경제나 먹거리 관련 글을 주로 쓰는 사람