리눅스에서 Sed 사용하기

Sed는 파일을 생성하거나 편집하지 않는 간단한 UNIX 프로그램입니다. 입력을 통해 전달되는 데이터만 수정하고 수정된 데이터를 출력합니다. 여기에서는 UNIX 철학에 대한 간략한 개요를 살펴보고, sed 사용의 기초를 다룬 후, 일상 작업에 프로그램을 사용하는 방법의 예를 보여줍니다.
목차
- Sed 사용의 기초
- 텍스트 스트림 선택 및 다듬기
- Sed 스트림에서 텍스트 제거
- Sed 스트림에 새 텍스트 추가
- Sed에서 텍스트 찾기 및 대체
- 텍스트 데이터를 보류 공간으로 복사
- Sed에서 루프 생성에 레이블 사용
- Sed에서 영구적인 변경 만들기
Sed 사용의 기초
Sed는 텍스트 데이터 스트림을 읽고 수정할 수 있는 프로그램입니다. 이것은 일반 텍스트 편집기와 달리, sed가 컴퓨터의 파일을 직접 변경하지 않음을 의미합니다. 대신, 수신 데이터에 대한 “필터” 역할을 하며 원하는 방식으로 변환할 수 있게 해줍니다.
Sed를 시작하려면, 먼저 최소 다섯 줄의 텍스트가 있는 파일을 생성하세요. 각각의 줄 사이에는 “새 줄” 문자가 있도록 합니다:
printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txt참고: 이 가이드는 sed를 설명하기 위해 다중 줄 텍스트 파일을 사용하지만, 프로그램의 모든 하위 명령은 UNIX 파이프에서 들어오는 텍스트에도 작동합니다.
Sed의 일반 명령은 다음과 같습니다:
sed[option]'{script}'[text file]Sed의 가장 기본적인 기능 중 하나는 n 하위 명령입니다. 이 명령은 sed의 입력에서 데이터를 읽고, 프로그램의 “패턴 공간”에 배치하는 역할을 합니다. 이는 sed가 조작을 수행하기 전에 진입하는 텍스트를 보관하는 특별한 버퍼입니다:
sed n hello.txt
Sed의 또 다른 기본 기능은 p 하위 명령입니다. n과 유사하게, 이 명령은 sed의 입력에서 들어오는 데이터를 읽고 프로그램의 패턴 공간에 배치합니다. 그러나 터미널 출력에 명시적으로 출력합니다.
p 하위 명령을 사용할 때 초보자에게 혼동을 줄 수 있습니다. 텍스트 입력으로 실행하면 sed가 출력을 두 번 인쇄하기 때문입니다. 이는 sed가 기본적으로 p가 존재하든 없든 패턴 공간을 자동으로 출력하기 때문입니다:
sed p hello.txt
이러한 이상한 동작을 비활성화하려면 sed 하위 명령을 실행하기 전에 -n 플래그를 추가하세요:
sed-n p hello.txt
기초가 해결되었으니, 다음 섹션에서는 텍스트 데이터를 조작하기 위해 sed를 사용할 수 있는 다양한 방법을 살펴보겠습니다.
1. 텍스트 스트림 선택 및 다듬기
출력 외에도, sed를 사용하여 데이터 스트림 및 파일에서 텍스트를 선택하고 다듬을 수 있습니다. 가장 쉬운 방법은 p 하위 명령에 범위 값을 추가하는 것입니다.
다음 명령은 sed의 범위 구문을 사용하여 “hello.txt” 파일의 3번째에서 5번째 줄을 출력합니다:
sed-n'3,5p' hello.txt
또한 p 하위 명령을 사용하여 비인접 줄을 출력할 수 있습니다. 예를 들어, 다음 명령은 “hello.txt” 파일의 첫 번째와 네 번째 줄을 출력합니다:
sed-n'1p; 4p' hello.txt2. Sed 스트림에서 텍스트 제거
Sed는 또한 들어오는 텍스트 스트림에서 데이터를 삭제할 수 있습니다. 이는 큰 파일에서 몇 줄의 텍스트를 제거하거나 프로그램의 출력을 정리하여 필요한 정보만 표시하려는 경우 유용합니다.
이를 위해 d 하위 명령을 사용하여 삭제하려는 특정 줄 또는 범위를 지정합니다:
sed-n'2d; 5d; p' hello.txt
텍스트 줄을 인쇄하는 것과 유사하게, d 하위 명령은 다중 줄 범위에서도 작동합니다. 예를 들어, 다음 명령은 “hello.txt” 파일에서 처음 네 줄을 삭제합니다:
sed-n'1,4d; p' hello.txt특정 줄 범위를 일치시키는 것 외에도, 정규 표현식을 사용하여 삭제할 텍스트를 찾을 수 있습니다. 이를 통해 sed는 “world”라는 단어가 포함된 줄을 찾아 삭제하라는 지시를 받습니다:
sed-n'/world/ d; p' hello.txt정규 표현식을 입력 파일의 범위로 취급할 수도 있습니다. 이를 통해 프로그램 내에서 선택을 정의하는 데 더 유연성을 제공합니다:
sed-n'/world/,/wonderful/ d; p' hello.txt
3. Sed 스트림에 새 텍스트 추가
텍스트를 삭제하는 것 외에도, sed는 기존 데이터 스트림에 새 텍스트를 추가할 수 있습니다. 전체 텍스트 편집기의 수준은 아니지만, 이 기능은 일회성 수정 및 기본 텍스트 추가 시 여전히 유용할 수 있습니다.
새 줄의 텍스트를 추가하려면 a 명령과 추가할 텍스트를 사용하여 sed를 실행합니다:
sed-ne'$a hello'-e'p' hello.txt
참고: -e 플래그는 sed에 인용된 문자열이 sed 표현이라는 것을 알려줍니다. 이를 통해 sed를 여러 번 호출하지 않고도 여러 표현식을 연결할 수 있습니다.
전체 파일을 sed 텍스트 스트림에 포함시키는 것도 가능합니다. 그렇게 하려면 추가할 파일 이름 뒤에 r 명령을 사용하세요:
sed-ne'$r welcome.txt'-e'p' hello.txt
4. Sed에서 텍스트 찾기 및 대체
Sed의 가장 강력한 기능 중 하나는 텍스트 스트림에서 텍스트를 찾고 대체할 수 있는 능력입니다. 텍스트를 추가하고 삭제하는 것과 달리, 이는 UNIX 파이프를 통해 전달되는 데이터 동적 수정을 가능하게 하여 일반 텍스트 편집기보다 훨씬 유연합니다.
수정 없이 텍스트 입력을 테스트 프린트하는 것으로 시작합니다:
sed-ne'p' hello.txt
p 하위 명령을 s로 바꾸고, 뒤에 세 개의 역슬래시 (/)를 추가합니다:
sed-ne's///'-e'p' hello.txt구조적 정규 표현식을 일치시키려는 문자열 사이의 첫 번째와 두 번째 역슬래시 사이에 입력합니다. 예를 들어, 다음 값을 사용하여 내 입력 문자열에서 “wo”로 시작하는 단어를 찾을 수 있습니다:
sed-ne's/wo*.//'-e'p' hello.txt텍스트 커서를 두 번째와 세 번째 역슬래시 사이에 두고, 일치하는 값을 대체할 텍스트를 제공합니다. 이전 열과 달리, 이 섹션에서는 구조적 정규 표현식을 사용하지 않습니다:
sed-ne's/wo.*/website/'-e'p' hello.txt기본적으로, sed는 특정 줄에서 일치하는 첫 번째 문자열만 대체합니다. 이는 텍스트 스트림에서 단어의 모든 인스턴스를 교체하려는 경우 문제가 될 수 있습니다. 이를 해결하려면 표현식의 세 번째 역슬래시 뒤에 g 옵션을 추가합니다:
sed-ne's/wo.*/website/g'-e'p' hello.txt
5. 텍스트 데이터를 보류 공간으로 복사
Sed는 텍스트 데이터를 저장하기 위해 두 개의 버퍼를 사용합니다: 패턴 공간과 보류 공간. 전자는 텍스트가 sed 표현을 통과하는 동안 임시적인 장소로 작용합니다. 반면, 후자는 임의의 텍스트 데이터를 저장할 수 있는 클립보드 역할을 합니다.
이 접근 방식의 한 가지 이점은 외부 프로그램에 의존하지 않고 특정 출력을 “유지“할 수 있다는 것입니다. 이는 다단계 텍스트 조작을 처리하기 위해 sed를 사용할 계획이 있을 때 유용할 수 있습니다.
보류 공간을 사용하려면 먼저 파일에 몇 줄의 텍스트가 포함되어 있는지 확인하세요:
sed-ne'p' hello.txtp 하위 명령을 h로 바꾸고, sed가 파일에서 일치할 줄 번호 또는 정규 표현식 값을 제공합니다. 이렇게 하면 sed에게 그 특정 텍스트 줄을 가져와서 보류 공간에 복사하라는 지시를 하게 됩니다:
sed-ne'3h' hello.txt참고: 보류 공간 내의 데이터는 서로 다른 sed 명령 간에 지속되지 않습니다.
H 하위 명령을 사용하여 보류 공간에 여러 줄의 텍스트를 저장할 수도 있습니다. 예를 들어, 다음 명령은 텍스트 파일의 세 번째와 네 번째 줄을 저장하고 이를 터미널에 출력합니다:
sed-ne'3,4H; $ {x; p}' hello.txt
6. Sed에서 루프 생성에 레이블 사용
Sed는 포괄적인 프로그래밍 언어는 아니지만, 프로그램 내에서 루프를 생성하는 것은 여전히 가능합니다. 특정 텍스트 입력에 대해 반복해야 하는 sed 표현이 필요할 때 유용합니다.
Sed에서 루프를 생성하려면 먼저 sed 표현을 위한 레이블을 만들어야 합니다. 이를 위해서는 : 하위 명령을 사용한 다음 사용하고자 하는 레이블을 지정합니다.
sed-e':x' hello.txtSed 표현의 일치 기준을 제공하세요. 제 경우에는 입력 텍스트의 모든 줄의 끝으로 이동하기를 원합니다:
sed-e':x; $' hello.txt일치하는 값을 찾을 때마다 실행하려는 sed 하위 명령을 입력한 후, 중괄호로 묶습니다. 다음은 두 개의 인접한 줄을 결합하고, 새 줄 문자를 공백으로 대체한 후, 표현의 시작으로 돌아가는 것입니다:
sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt
이것을 거의 모든 종류의 입력 텍스트에 대해 확장할 수도 있습니다. 예를 들어, 다음 명령은 sed의 확장 정규 표현식 기능을 사용하여 입력 텍스트에서 HTML 태그를 제거합니다:
sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html
7. Sed에서 영구적인 변경 만들기
다른 UNIX 도구와 마찬가지로, sed는 출력 리디렉션 및 파이프의 이점을 활용할 수 있습니다. 이는 sed와 다른 프로그램을 결합할 수 있게 해주며, 변경 사항을 영구적으로 만들 기회를 제공합니다.
다음 줄의 코드는 sed 명령의 출력에서 새로운 “welcome.txt” 파일을 생성합니다:
sed-ne'2p; 6p' hello.txt > hi.txt
출력 리디렉션 외에도, 내장된 -i 플래그를 사용하여 현재 파일을 편집할 수 있습니다. 이렇게 하면 터미널 콘솔에서 변경 사항을 출력하는 대신 파일을 편집할 수 있습니다. 예를 들어, 다음 명령은 텍스트 파일에서 모든 새 줄 문자를 제거하고 저장합니다:
sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt
이 모든 말로 리눅스 명령줄에 호기심이 생겼다면, 오늘 사용할 수 있는 가장 흥미로운 Bash 프롬프트에 대한 이전 기사를 읽어보실 수 있습니다.
이미지 출처: Unsplash의 Morgan Richardson. 모든 수정 및 스크린샷은 Ramces Red입니다.