Home » OS » 리눅스 » 리눅스 sed 명령어로 파일의 특정 line을 지워 봅시다.

리눅스 sed 명령어로 파일의 특정 line을 지워 봅시다.

리눅스 sed 명령어는 stream을 filtering 하고 transform 하는 명령어입니다. 한 마디로 가공하는 역할을 해요. 이 글에서는 파일의 특정 line을 삭제하는 방법을 배워보도록 하겠습니다.


명령어와 옵션들

먼저, 이 명령어가 무엇을 하는 것인지, 그리고 우리의 요구 사항에서 어떤 옵션들이 필요한지 보도록 하겠습니다.

[그림 1] 리눅스 sed 명령어의 설명

sed는 stream editor로, 텍스트를 filtering 하고, 변환하기 위해 씁니다. 몇 가지 옵션들을 먼저 보도록 하겠습니다.

[그림 2] e 옵션

먼저 -e script입니다. script가 오는 경우 앞에 -e를 추가할 수 있어요. 한 개의 줄을 삭제할 때에는 1개의 위치만 주면 됩니다. 그런데, 여러 개의 줄을 삭제할 때에는 여러 개의 위치를 주어야 겠지요. 이는 밑에서 address를 설명할 때 다시 언급하겠습니다.

[그림 3] i 옵션

다음 -i 옵션입니다. file을 편집하는데, 제자리에서 편집한다고 되어 있어요. 파일을 직접 수정한다는 의미입니다. 특정 파일에서 x번째 줄을 지우기 위해서, redirection을 쓰는 것을 생각할 수 있는데요. 의도대로 동작하지 않을 겁니다.

그렇게 하지 말고, -i 옵션을 주고, 뒤에 file 명을 주어야 합니다. 이 부분 조심하세요.


address

address는 한국어로 번역하면 주소입니다. 즉, 어느 위치에서 sed가 실행될 것인지 알려주는 역할을 하게 됩니다.

[그림 4] address에 대한 설명

문서를 읽다 보면, address가 나옵니다.

  • 이게 주어지지 않으면 모든 입력 줄에서 실행됩니다.
  • 이로 미루어 보았을 때, 범위나 수 등을 지정하면 조건을 만족하는 줄에서 실행됩니다.

이 위치가 여러 개가 있을 수 있는데요. ; (comma)로 구분할 수 있습니다.

[그림 5] number의 의미

이제, number의 의미를 봅시다. number의 의미는 줄 number를 의미합니다. 예를 들어 5는 5번째 줄을 의미합니다. 8은 8번째 line을 의미합니다.

[그림 6] address 뒤에 붙는 command

이제 address 뒤에 붙는 command를 봅시다. 우리는 삭제를 원하므로, d가 답입니다. 1d는 무엇이겠나요? 1번째 줄이 match가 되니, 해당 줄을 삭제하겠다는 의미입니다. 이 내용까지 정리해 봅시다.

1d;3d

script 1

스크립트 1은 무엇을 의미할까요? 이것도 천천히 해석해 볼까요?

  • 1d와 3d가 ;로 구분되었습니다. 1d 부터 봅시다.
    • 1은 수이니 1번째 line에 match 됩니다.
    • 뒤에 d가 붙었지요? 삭제를 의미합니다.
  • 3d 는 어떨까요?
    • 3은 수이니 3번째 line에 match 됩니다.
    • 뒤에 d가 붙었지요? 삭제를 의미합니다.

따라서 스크립트 1은 1번째 줄과 3번째 줄을 삭제하라는 의미가 됩니다. 어렵지 않지요?


리눅스 sed 명령어로 특정 줄 지우는 예제

이제 실전에서 쓸 만한 예제를 보겠습니다.

[그림 7] 1.txt에 있는 내용

먼저, 1.txt에는 1, 2, 3333 4444 5555, 4, 5, 6, 7, 8, 9, 10이 있습니다. 여기서 우리는 3번째 줄과 5번째 줄을 출력하지 않고 싶어요. 이는, 3번째 줄과 5번째 줄을 제거하라는 의미와 같습니다.

  • 3d
  • 5d

이렇게 2개가 ;로 구분되어서 들어가면 됩니다.

[그림 8] 명령어의 정답

따라서, -e 옵션으로 ‘3d;5d’를 주면 됩니다. 그런데 실제로, 1.txt에 반영되지 않았습니다. 반영을 시키려면 -i 옵션을 주면 됩니다. 파일 자체를 수정하는 옵션입니다.

[그림 9] 파일을 수정하는 -i 옵션

-i 옵션을 넣으면 1.txt를 수정해요. 위와 같이 입력한 다음에, 다시 1.txt에 있는 내용을 보겠습니다. 그러면, 3333 4444 5555와 5가 출력되지 않았음을 알 수 있습니다. 이제 다음 예제를 봅시다.


zsh history 줄 삭제하기

zsh에서 history 파일의 특정 line을 삭제하는 방법을 알아봅시다. bash와는 다르게 zsh는 history에서 -d 옵션이 먹히지 않습니다. 그래서, 삭제하는 방법이 다소 복잡1합니다. 이 때, sed를 이용할 수 있어요.

[그림 10] history 파일

저는 echo 1, echo 3, echo 5 기록을 삭제하고 싶어요. 즉, 2번째 줄과 3번째, 4번째 줄을 삭제하면 됩니다. 어떻게 하면 될까요?

  • 2번째 줄, 3번째 줄, 4번째 줄 삭제는 2d;3d;4d로 묶입니다.
  • 보통 히스토리 파일은 $HISTFILE 이라는 환경 변수에 저장됩니다.
  • zsh의 경우 .zsh_history가 히스토리 파일입니다.

그렇기 때문에 홈 디렉토리에 있고, 해당 유저가 zsh를 쓴다면 아래와 같이 입력하면 됩니다.

[그림 11] 2 ~ 4번째 줄을 히스토리에서 지우는 명령어

다른 것은, file 이름 대신 $HISTFILE 이라는 것을 사용했다는 것입니다. 다시 로그인 하고 히스토리를 확인해 보겠습니다.

[그림 12] 히스토리 파일

놀랍게도, echo 1, echo 3, echo 5 기록이 삭제되었음을 알 수 있습니다.

  1. 그리고 사실 이 글을 쓰게 된 이유이기도 합니다. ↩︎

Leave a Comment

20 + 2 =