ed, edit
1. 개요
UNIX의 매우 기초적인 줄 단위 텍스트 편집기중의 하나로 POSIX 표준의 일부이다.2. 역사
무려 전신타자기와 동시대에 사용되었던 편집기이다. 전신타자기는 일종의 프린터였는데 문자만 출력 가능했고 속도가 매우 느렸다. 그래서 현대적인 방식의 워지워그 편집기보단 어디서, 어디까지 줄을 보여주고 그곳을 편집하고, 수정하는 것이 주류였다. 만약 줄을 수정할때마다 전체 결과물을 재출력한다면 줄 수가 늘어날때마다 심각하게 느려질 것이다. 지금은 후기 편집기인 vi가 나오고 강력한 통합 개발 환경이 대세가 되어갔지만 여전히 유닉스 호환 시스템에는 웬만해서는 vi와 함께 깔려는 있다.3. 특징
많은 주소 지정 방식과 명령어가 sed와 호환된다.3.1. 주소 지정
명령어를 실행하려면 적용받는 범위를 나타내야 하는데 이때 주소 지정이 쓰인다. 아무 주소 지정이 나타나지 않고 명령어가 바로 나오면 기본값은 현재 가리키고 있는 줄이다. 예를 들어, 정규 표현식으로 치환 기능을 사용할때 주소 지정이 없으면 전체 줄이 아닌 현재 줄에만 적용된다.- 10진 숫자 하나도 유효한 주소 지정이고 각 줄의 번호에 대응된다. 첫번째 줄의 시작은 1번이고 일부 명령어에 한해서 0번 줄도 인정된다.
- m 명령어는 특정 범위의 줄을 임의의 위치로 이동시키는데 삽입(Insert) 동작이 아닌 덧붙이기(Append) 동작이라 줄 처음으로 이동시키려면 1번 줄이 아닌 0번 줄로 이동시켜야 한다.
- 다음 소괄호안의 문자들은 특수한 목적으로 쓰인다. (
. , $ ' + -
) - 하나의 \'
.
\' 문자는 현재 줄을 가리킨다. - \'
,
\' 문자는 각 주소를 구분하기 위해 사용된다. 숫자 사이에 쓰면 간단하게 범위를 지정할 수 있다. - \'
$
\' 문자가 마지막 줄을 가리킨다. - 특정 명령어로 마크한 줄을 가리키려면 해당 마크 앞에 \'
'
\' 문자를 붙힌다. - \'
+ -
\'로 위치 독립적인 줄 번호를 지정할 수 있다.$-10
은 마지막 줄에서 10번째 줄 앞을 나타낸다.
3.2. 예시
- 유효한 주소 지정 방식의 예
- 주소 지정 모드 없음 : 명령어별로 기본 설정된 주소 지정 모드로 실행한다. \'
.
\'도 비슷한 동작을 하지만 명령어의 기본값이 아닌 현재 줄을 지정한다는 차이가 있다. 1a
: 1번 줄에서 덧붙이기 명령어에 진입한다.10,20d
: 10번 줄에서 20번 줄 사이를 삭제한다.+1s/^$//
: 다음 줄의 빈 줄을 삭제한다.1,$p
: 1번 줄에서 마지막 줄까지 모든 내용을 출력한다.- 유효하지 않은 주소 지정 방식의 예
- 대부분의 상황에서 0번 줄 : 일부 명령어를 제외하고 유효하지 않은 주소로 판단한다. 허용되는 대표적인 명령어는 이동 명령어인
m
이다. 하지만 이동 범위 자체가 0번 줄부터 시작될 수가 없다. .,-10n
: 시작 줄 번호가 끝나는 줄 번호보다 뒤에 있다. 시작 줄 번호로 \'.
\'를 지정하였으나 끝 줄 번호가 10번 줄 앞에 있으므로 잘못되었다.- 주소 지정 모드를 받지 않는 명령어 : \'
!
\' 명령어는 ed 내부 명령어 대신 셸의 명령어를 실행하기 때문에 주소 지정 모드가 필요하지 않다. 그 외에도 기본 범위가 전체인 명령어들이 몇가지 있다.
4. 명령어
명령어의 실행을 중단 또는 명령어 입력 모드로 나가려면 Ctrl+C로 터미널 인터럽트를 주어야 한다. 명령어의 순서가 키보드 배열보다는 의미 순으로 정해진 것은 vi보다 Emacs에 가까운 특징을 가진다.a
: 덧붙이기(Append) 동작을 한다. 0-1개 주소 지정 가능.c
: 줄 범위를 바꾼다. (Change) 0-2개 주소 지정 가능.d
: 줄 범위를 삭제한다. (Delete) 0-2개 주소 지정 가능.e
<파일 이름> : 해당 파일을 열고 바이트 수를 출력한다. (Edit) 이 명령어를 대문자로 입력하면 편집중인 내용을 무시하고 강제로 파일을 연다.f
<파일 이름> : 저장할 파일 이름을 설정한다. (Filename)g/RE/commands
: 전체 줄을 대상으로 정규 표현식을 평가하고 일치하는 줄에 대해서 명령어들을 실행한다. 아무 명령어도 없으면 기본 동작은 일치하는 줄을 출력한다. 대문자 변형인G
명령어는 수정하기 전에 대화형으로 수정할 내용을 보여준다.h
: 마지막으로 출력된 물음표 알림에 대해 조금 더 상세한 이유를 알려준다. 대문자로 입력하면 다음에 물음표가 출력될때마다 같은 동작을 한다.i
: 삽입하는(Insert) 동작을 한다. 0-1개 주소 지정 가능.j
: 여러 줄을 한 줄로 연결(Join)한다. 2개 주소 지정 가능.k
: 명령어 앞의 주소를 뒤에 오는 알파벳 소문자에 대한 별칭으로 마킹한다. (Mark)l
: 몇가지 제어 문자나 눈에 보이지 않는 특수 문자를 역슬래시 이스케이프 형식으로 표시한다.m
: 줄 하나 또는 범위를 임의의 위치로 이동시킨다. 0번 줄도 이동 위치로 인정된다. 왜냐하면 이동 동작이 덧붙힘이기 때문에 1번줄까지만 허용하면 줄의 처음으로 이동시킬 수 없기 때문이다.n
: 줄 번호와 탭 문자, 줄의 내용을 같이 출력한다.p
: 줄 내용만 출력한다.P
: 명령어 입력중일때, 맨 앞에*
기호를 붙힌다. 명령어가 아직 작동중인지 아닌지를 쉽게 구분할 수 있다.q
: 편집기를 종료한다. 대문자로 입력하면 강제로 종료한다.r
<파일 이름> : 해당 파일을 읽어서 임의 위치 줄에 덧붙힌다. m 명령어와 마찬가지로 0번 줄도 유효한 주소이다.s
: sed(UNIX) 문서 참고.t
: m 명령어와 비슷하지만 이동이 아닌 복사(Copy) 동작을 한다.u
: 직전에 수정한 편집을 되돌린다. (Undo)v/RE/commands
: g, G 명령어와 동작이 비슷하지만 표현식이 일치하지 않는 줄을 대상으로 한다.w
<파일 이름> : 수정한 내용을 저장한다. f 명령어나 e 명령어 또는 명령줄에서 파일을 바로 열었을때는 파일 이름을 생략할 수 있다. 다만 vi처럼 wq와 같이 저장과 종료를 같이할 수는 없다. 저장에 성공하면 파일의 크기가 출력된다.=
: 마지막 줄 번호를 출력한다.!
: 셸 명령어를 직접 실행한다.
5. 사용법
현재 ed는 거의 쓰이지 않고 오래된 기기와 상호 작용하기 위해 사용된다. 전신타자기는 프린터에 가까워서 vi와 같은 비주얼 에디터조차 구동시킬 수 없기 때문이다. 주로 고전 기기를 다루는 매체에서 자주 등장한다.6. 관련 문서
- sed(UNIX) : ed의 기능을 간소화하고 줄 단위 필터링 및 편집 기능을 강화한 유틸리티.