리눅스

[리눅스] ed, sed 명령어

Zino. 2024. 4. 20. 00:57

ed 명령어

ed는 텍스트 편집 명령어 이다.

line oriented text editor 이다.

 

만약 animals.txt 라는 파일을 편집하려면 다음과 같이 명령어를 입렵하면 된다.

ed animals.txt

이렇게 하면 편집 모드로 들어가게 된다.

위에서 이야기했듯이 ed는 line 별로 처리를 하는 편집기이다.

편집모드에 들어가면 위와같은 상태이다.

여기서 n 번째 줄의 내용을 보려면 n 을 입력하면 된다.

3번째 줄을 읽어보자

이렇게 내가 입력한 내용에 대한 출력이 한줄한줄 나온다.

 

ed 내에서 명령어의 기본 구조는 다음과 같다.

[address] [명령] [정규식]

여기서 address 는 범위를 이야기 한다.

명령 부분은 어떤 작업을 할지 넣는 부분이다. p, s, g, d 명령어에 대해 살펴볼 것이다.

정규식 내용은 이전에 정리해 둔 부분을 참고하자

https://zino-dev.tistory.com/15

 

[리눅스] 정규표현식(regex, regular expression)

정규표현식 정규표현식은 특정 패턴을 가진 요소를 찾을 때 사용된다. 보통 grep 명령어와 함께 사용한다. 정규표현식에는 . ^ $ [ ] * /+ \? { } \( \) 등이 사용된다. 하나씩 어떤 목적을 가지고 사용

zino-dev.tistory.com

 

먼저 p 명령을 보자

p는 출력 명령이다. 만약 1줄부터 3번째 줄까지 출력하고 싶다면 다음과 같이 실행하면 된다.

처음부터 끝까지 출력하고싶다면 

1,$ 를 사용하면 된다. 정규식 내용에서 $ 는 끝나는 부분을 의미한다.

 

이제 s 명령에 대해 알아보자

s 는 특정 문자를 대체하라는 명령이다.

바로 위에서 animals.txt 의 전체 내용을 확인했다.

t 를 모두 T로 바꾸는 명령어를 작성해보자.

1,$ 는 첫줄부터 끝까지의 의미이고

s 는 대체하라는 명령이고

/t/T/ 는 t와 T 를 지정하는 것이다.

1,$p 를 이용해서 내용을 살펴보니 각 줄에서 처음만나는 t만 T 로 바뀐것을 볼 수 있다.

그럼 전체를 바꾸려면 어떻게 해야할까

여기서 g를 사용한다.

명령 맨뒤에 global 의미인 g 를 붙여주니 반복해서 s 명령을 실행한다.

이번엔 모든 대문자를 ++ 로 바꾸는 명령을 입력해보자

모든 대문자들이 ++ 로 바뀐 것을 확인 할 수 있다.

 

이번엔 모든 모음을 없애는 명령을 작성해보자

s 를 이용해 대체를 하지만 아무것도 입력하지 않으면 삭제가 되는것이나 마찬가지이다.

 

d는 지우기 명령이다. 1d 를 입력하면 첫번째 줄이 지워진다.

 

만약 편집한 내용을 저장하지않고 종료하고 싶으면 ctrl+d 를 두번 누르면 된다.

저장하고 종료하고 싶다면 w를 입력하고 q 를 입력해도 종료가 된다.

244 는 새로 저장된 글자 수 이다.

 

 

sed 명령어

우선 sed 명령어를 알아보기 전에 다음 문제를 한번 해결해보자.

animals.txt 에서 python 을 PYTHON 으로 바꾸고 저장하여라.

tr 명령어를 사용하면 쉬울 것 같아 보인다.

하지만 리다이렉션으로 바로 원본 파일에 내용을 저장할 수 없어 tmp 파일을 만든 후 mv 명령어로 저장해줘야한다.

 

sed는 조금 더 간단히 해결 할 수 있다.

sed는 명령줄에서 바로 파일의 내용을 수정할 수 있다.

위 명령어를 하나하나 살펴보자

-i 는 현재 파일에 그대로 저장하고 싶을때 사용하는 것이다. 만약 다르게 저장하고 싶다면 -iE 를 쓰면 된다. 

만약 위 경우에 -iE를 쓴다면 저장되는 파일은 animalsE.txt 로 저장된다.

그리고 가운데 's/python/PYTHON/g'는 ed 명령어 에서 알아본 내용과 같다.

 

이번엔 a.txt 파일에 있는 hello 라는 내용을 world 라고 바꾸는 명령어를 작성해보자

sed -i 's/hello/world/g' a.txt

위와같이 작성하면 된다.

이렇게 보면 sed 를 사용하나 ed 를 사용하나 같은 명령인거 같다

하지만 sed는 파이프라인으로 받을 수 있다는 장점이 있다.