Jump to content

sed

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning
sed
Paradigmscripting
Designed byLee E. McMahon
First appeared1974; 50 years ago (1974)
Implementation languageC
Influenced by
ed
Influenced
Chomski, Perl, AWK

sed ("스트림 편집기")는 단순, 간결한 프로그래밍 언어를 사용하여 텍스트를 구문 분석하고 변환하는 유닉스 유틸리티입니다. sedBell LabsLee E. McMahon에 의해 1973년부터 1974년까지 개발했고,[1] 오늘날 대부분의 운영 시스템에서 사용할 수 있습니다.[2] sed는 대화형 편집기 ed ("editor", 1971)와 이전 qed ("quick editor", 1965–66)의 스크립팅 기능을 기반으로 했습니다. sed정규 표현식을 지원하는 초기 도구 중 하나였었고, 텍스트 처리, 무엇보다도 특히 치환 명령에 계속 사용됩니다. 일반 텍스트 문자열 조작 및 "스트림 편집"을 위한 인기 있는 대안적인 도구는 AWKPerl을 포함합니다.

History

버전 7 유닉스에서 처음 등장한,[3] sed는 데이터 파일의 명령줄 처리를 위해 구축된 초기 유닉스 명령 중 하나입니다. 그것은 인기 있는 grep 명령의 자연스러운 후계자로 발전했습니다.[4] 원래 동기는 대체에 대해 grep (g/re/p)의 아날로그였고, 따라서 "g/re/s"입니다.[3] 각 명령에 대해 추가 특수-목적 프로그램, 예를 들어, g/re/d와 같은 것이 발생할 것을 예상한 McMahon은 일반적인-목적 줄-지향된 스트림 편집기를 작성했으며, 그것이 sed가 되었습니다.[4] sed에 대한 구문, 특히 패턴 일치를 위한 /, 및 대체를 위한 s///의 사용은 당시 공통으로 사용되었던 sed의 전신, ed에서 시작되었고,[4] 정규 표현식 구문이 다른 언어, 특히 ECMAScriptPerl에 영향을 미쳤습니다. 나중에, 더 강력한 언어 AWK가 개발되었고, 이들은 사촌처럼 기능하여, 쉘 스크립트에 의해 수행될 강력한 텍스트 처리를 허용합니다. sed와 AWK는 Perl의 조상이자 영감으로 자주 인용되고, Perl의 구문과 의미 체계, 특히 일치 및 대체 연산자에 영향을 미쳤습니다.

GNU sed는 파일의 제자리에 편집을 포함하여 몇 가지 새로운 기능을 추가했습니다. Super-sedPerl과 호환되는 정규식을 포함하는 sed의 확장된 버전입니다. sed의 또 다른 변종은 원래 Eric S. Raymond에 의해 4.1BSD sed에서 리버스-엔지니어링되고 현재 René Rebe에 의해 유지 관리되는 minised입니다. miniised는 GNU 프로젝트가 새로운 GNU 정규 표현식 라이브러리를 기반으로 하는 새 버전의 sed를 작성할 때까지 GNU 프로젝트에서 사용되었습니다. 현재 minised는 BSD sed에 대한 일부 확장이 포함하고 있지만 GNU sed만큼 기능이 풍부하지는 않습니다. 그것의 장점은 매우 빠르고 메모리를 거의 사용하지 않는다는 것입니다.[citation needed] 그것은 임베디드 시스템에서 사용되고 Minix와 함께 제공되는 sed 버전입니다.[citation needed]

Mode of operation

sed는 줄-지향 텍스트 처리 유틸리티입니다: 그것은 입력 스트림 또는 파일에서 패턴 공간이라고 하는 내부 버퍼로 텍스트를 줄-단위로 읽습니다. 각 줄 읽기는 사이클을 시작합니다. 패턴 공간으로, sedsed 스크립트를 통해 지정된 하나 이상의 작업을 적용합니다. sed는 텍스트에 대한 작업을 지정하는 약 25개의 명령으로 프로그래밍 언어를 구현합니다. 각 입력 줄에 대해, 스크립트를 실행한 후, sed는 보통 패턴 공간 (스크립트에 의해 수정된 줄)을 출력하고 그 다음 줄에서 싸이클을 다시 시작합니다. 다른 스크립트-의-끝 동작은 sed 옵션과 스크립트 명령을 통해 사용할 수 있습니다. 예를 들어, d는 패턴 공간을 삭제하고, q는 종료하고, N은 패턴 공간에 즉시 다음 줄을 추가하고, 등입니다. 따라서 sed 스크립트는 루프 자체와 루프 변수 (현재 줄-번호)가 암시적이고 sed에 의해 유지되는 스트림의 줄을 통해 반복하는 루프의 몸체에 해당합니다.

sed 스크립트는 명령줄에서 지정되거나 (-e 옵션) 별도의 파일에서 읽을 수 있습니다 (-f 옵션). sed 스크립트에서 명령은 줄 번호 또는 정규 표현식의 관점에서 선택적 주소를 취할 수 있습니다. 주소는 명령이 실행될 때 결정합니다. 예를 들어, 2d는 오직 두 번째 입력 줄 (두 번째 줄을 제외한 모든 줄을 인쇄)에 대한 d (삭제) 명령을 실행하지만, /^ /d는 스페이스로 시작하는 모든 줄을 삭제합니다. 별도의 특수 버퍼, 유지 공간은 사이클 사이에 텍스트를 유지하고 축적하기 위해 몇 가지 sed 명령에 의해 사용될 수 있습니다. sed의 명령 언어는 오직 두 개의 변수 ("유지 공간"과 "패턴 공간")와 GOTO-같은 분기하는 기능을 가집니다; 그럼에도 불구하고, 그 언어는 Turing-complete이고,[5][6] sokoban, arkanoid,[7] chess,[8]tetris와 같은 게임을 위한 난해한 sed 스크립트가 존재합니다.[9]

주요 루프는 입력 스트림의 각 줄에 대해 실행되어, 입력의 각 줄에서 sed 스크립트를 평가합니다. sed 스크립트의 줄은 각각 패턴-동작 쌍으로, 일치시킬 패턴과 수행할 동작을 나타내며, 조건문으로 다시 구성될 수 있습니다. 주요 루프, 작업 변수 (패턴 공간과 유지 공간), 입력과 출력 스트림, 및 기본 동작 (줄을 패턴 공간으로 복사, 패턴 공간을 인쇄)이 암시적이기 때문에, 간결한 한-줄짜리 프로그램을 작성하는 것이 가능합니다. 예를 들어, sed 프로그램은 다음에 의해 제공됩니다:

10q

이것은 입력의 처음 10 줄을 인쇄하고, 그런-다음 중지할 것입니다.

Usage

Substitution command

다음 예제는 sed: 치환의 전형적이고, 가장 공통적인 사용을 보여줍니다. 이 사용법은 실제로 sed에 대해 원래 동기였습니다:[4]

sed 's/regexp/replacement/g' inputFileName > outputFileName

sed의 일부 버전에서, 표현식이 뒤에 오는 것을 나타내기 위해 표현식 앞에 -e가 있어야 합니다. s는 치환을 의미하지만, g는 전역을 의미하며, 이것은 줄에서 일치하는 모든 항목이 대체됨을 의미합니다. 검색될 정규 표현식 (예를 들어, 패턴)은 첫 번째 구분하는 기호 (여기서 슬래시) 뒤에 배치되고 대체는 두 번째 기호 다음에 옵니다. 슬래시 (/)는 ed에서 "검색"에 대한 문자에서 비롯된 관례적인 기호이지만, 임의의 다른 것이 패턴 또는 대체에서 발생하지 않으면 구문을 더 읽기 쉽게 만들기 위해 사용될 수 있습니다; 이것은 "기울어진 이쑤시개 증후군"을 피하기 위해 유용합니다.

ed의 검색-및-바꾸기에서 비롯된 치환 명령은 간단한 구문 분석과 템플릿을 구현합니다. regexp는 패턴 일치와 하위-표현식을 통해 텍스트 저장을 모두 제공하지만, replacement는 정확한 텍스트 또는 "전체 일치"에 대해 & 문자를 포함하는 형식 문자열이거나 n번째 저장된 하위-표현식에 대해 특수 탈출 시퀀스 \1에서 \9까지일 수 있습니다. 예를 들어, sed -r "s/(cat|dog)s?/\1s/g"은 기존 "s"를 복제없이 "cat" 또는 "dog"의 모든 발생을 "cats" 또는 "dogs"로 바꿉니다: (cat|dog)는 정규 표현식에 저장된 첫 번째 (및 유일한) 하위-표현식이고, 형식 문자열에서 \1은 이것을 출력으로 치환합니다.

Other sed commands

치환 외에도, 약 25개의 sed 명령을 사용하여 다른 형식의 간단한 처리가 가능합니다. 예를 들어, 다음은 d 명령을 비어 있거나 공백만 포함된 행을 삭제하기 위해 사용합니다:

sed '/^ *$/d' inputFileName

이 예제는 다음 정규 표현식 메타-문자 중 일부를 사용합니다 (sed는 정규 표현식의 전체 범위를 지원합니다):

  • 캐릿 (^)는 줄의 시작과 일치합니다.
  • 달러 기호 ($)는 줄의 끝과 일치합니다.
  • 별표| (*)는 0개 이상의 이전 문자의 발생과 일치합니다.
  • 더하기 (+)는 하나 이상의 이전 문자의 발생과 일치합니다.
  • 물음표 (?)는 0개 이상의 이전 문자의 발생과 일치합니다.
  • (.)은 정확하게 하나의 문자와 일치합니다.

복잡한 sed 구조가 가능하여, 단순하지만 높게 전문화된, 프로그래밍 언어로 사용하는 것을 허용합니다. 예를 들어 제어 흐름은 레이블 (콜론 다음에 문자열)과 분기 명령 b의 사용에 의해 관리될 수 있습니다. 유효한 레이블 이름이 뒤에 오는 명령어 b는 해당 레이블 다음의 블록으로 처리를 이동할 것입니다.

sed used as a filter

유닉스 아래에서, sed는 종종 파이프라인에서 필터로 사용됩니다:

generateData | sed 's/x/y/g'

즉, "generateData"와 같은 프로그램이 데이터를 생성하고, 그런-다음 sedxy로 대체하는 작은 변경을 수행합니다. 예를 들어:

$ echo xyz xyz | sed 's/x/y/g'
yyz yyz

[notes 1]

File-based sed scripts

subst.sed와 같은 스크립트 파일에 여러 sed 명령을 한 줄에 하나씩 넣고, 그런-다음 -f 옵션을 파일에서 명령 (예를 들어, s/x/y/g)을 실행하기 위해 사용하는 것이 종종 유용합니다:

sed -f subst.sed inputFileName > outputFileName

임의의 숫자의 명령은 스크립트 파일에 배치될 수 있고, 스크립트 파일을 사용하는 것은 역시 쉘 탈출 또는 치환 문제도 피합니다.

그러한 스크립트 파일은 sed 명령을 포함하는 "shebang 줄"을 그것 앞에 추가하고 파일에 실행-가능 권한을 할당함으로써 명령줄에서 직접 실행 가능하게 만들 수 있습니다. 예를 들어, subst.sed 파일은 다음 내용으로 생성될 수 있습니다:

#!/bin/sed -f
s/x/y/g

그 파일은 그런-다음 chmod 명령과 함께 현재 사용자에 의해 실행 가능하게 만들 수 있습니다:

chmod u+x subst.sed

그 파일은 그런-다음 명령줄에서 직접 실행될 수 있습니다:

subst.sed inputFileName > outputFileName

In-place editing

GNU sed에 도입된 -i 옵션은 파일의 제자리에서 편집을 허용합니다 (실제로는, 임시 출력 파일이 백그라운드에서 생성되고, 그런-다음 원본 파일이 임시 파일로 대체됩니다). 예를 들어:

sed -i 's/abc/def/' fileName

Examples

Hello, world! example

# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
q

"Hello, world!" 스크립트는 파일 (예를 들어, script.txt)에 있고, sed -f script.txt inputFileName으로 호출되며, 여기서 "inputFileName"은 입력 텍스트 파일입니다. 스크립트는 "inputFileName" 줄 #1을 "Hello, world!"로 변경하고, 그런-다음 종료하여, sed가 탈출하기 전에 결과를 인쇄합니다. 줄 #1 이후의 임의의 입력 줄은 읽히지 않고 인쇄되지 않습니다. 따라서 유일한 출력은 "Hello, world!"입니다.

그 예제는 sed의 많은 주요 특성을 강조합니다:

  • 일반적인 sed 프로그램은 다소 짧고 간단합니다.
  • sed 스크립트는 주석 (# 기호로 시작하는 줄)을 가질 수 있습니다.
  • s (치환) 명령은 가장 중요한 sed 명령입니다.
  • sed는 q (종료)와 같은 명령과 함께 간단한 프로그래밍을 허용합니다.
  • sed는 .* (0개 이상의 문자)와 같은 정규 표현식을 사용합니다.

Other simple examples

아래에 다양한 sed 스크립트를 따르십시오; 이것들은 sed에 인수로 전달함으로써 실행될 수 있거나, 별도의 파일에 넣고 -f를 통해 실행되거나 스크립트 자체를 실행 가능하게 만들어서 실행될 수 있습니다.

파일에 있는 특정 단어의 임의의 인스턴스를 IRC 암호와 같이 "REDACTED"으로 바꾸고, 결과를 저장하기 위해:

sed -i s/yourpassword/REDACTED/ ./status.chat.log

단어 "yourword"를 포함하는 임의의 줄을 삭제하기 위해 (주소는 '/yourword/'입니다):

/yourword/ d

단어 "yourword"의 모든 인스턴스를 삭제하기 위해:

s/yourword//g

파일에서 두 단어를 동시에 삭제하기 위해:

s/firstword//g
s/secondword//g

명령줄에 입력할 때와 같이 이전 예제를 한 줄로 표현하기 위해, 세미콜론을 통해 두 명령을 결합할 수 있습니다:

sed "s/firstword//g; s/secondword//g" inputFileName

Multiline processing example

다음 예제에서, 보통 한 줄에서만 작동하는 sed는 두 번째 줄이 하나의 공백으로 시작하는 문장에서 줄 바꿈을 제거합니다. 다음 텍스트를 생각해 보십시오.

This is my dog,
 whose name is Frank.
This is my fish,
whose name is George.
This is my goat,
 whose name is Adam.

아래의 sed 스크립트는 위의 텍스트를 다음 텍스트로 바꿉니다. 스크립트는 오직 공백으로 시작하는 입력 줄에만 영향을 미친다는 것을 주목하십시오:

This is my dog, whose name is Frank.
This is my fish,
whose name is George.
This is my goat, whose name is Adam.

그 스크립트는 다음과 같습니다:

N
s/\n / /
P
D

이것은 다음과 같이 설명됩니다:

  • (N) 패턴 공간에 다음 줄을 추가합니다;
  • (s/\n / /) 공백이 뒤따르는 새 줄을 찾고, 한 스페이스로 바꿉니다;
  • (P) 패턴 공간의 맨 윗줄을 인쇄합니다;
  • (D) 패턴 공간에서 맨 윗줄을 삭제하고 스크립트를 다시 실행합니다;

이것은 세미콜론을 통해 한 줄로 표현될 수 있습니다:

sed 'N; s/\n / /; P; D' inputFileName

Limitations and alternatives

간단하고 제한적이지만, sed는 많은 목적에 충분히 강력합니다. 보다 정교한 처리를 위해, AWK 또는 Perl과 같은 보다 강력한 언어가 대신 사용됩니다. 이것들은 유지 버퍼를 사용함으로써 임의로 복잡한 변환이 원칙적으로 가능하지만 정규 표현식 추출과 템플릿 대체보다 더 복잡한 방식으로 줄을 변환하는 경우에 특히 사용됩니다.

반대로, 더 간단한 작업을 위해, grep (패턴과 일치하는 줄 인쇄), head (파일의 첫 번째 부분 인쇄), tail (파일의 끝 부분 인쇄), 및 tr (문자 번역 또는 삭제)과 같은 특수 유닉스 유틸리티 종종 선호됩니다. 그것들이 수행하도록 설계된 특정 임무에 대해, 그러한 특수 유틸리티는 보통 sed와 같은 보다 일반적인 해결책보다 더 간단하고 더 명확하고 더 빠릅니다.

ed/sed 명령과 구문은 텍스트 편집기 vivim과 같은 종속 프로그램에서 계속 사용됩니다. ed/sed와 유사한 것은 sam/ssam이며, 여기서 sam은 Plan 9 편집기이고, ssam은 그것에 대한 스트림 인터페이스로, sed와 유사한 기능을 제공합니다.

See also

Notes

  1. ^ In command line use, the quotes around the expression are not required, and are only necessary if the shell would otherwise not interpret the expression as a single word (token). For the script s/x/y/g there is no ambiguity, so generateData | sed s/x/y/g works correctly. However, quotes are usually included for clarity, and are often necessary, notably for whitespace (e.g., 's/x x/y y/'). Most often single quotes are used, to avoid having the shell interpret $ as a shell variable. Double quotes are used, such as "s/$1/$2/g", to allow the shell to substitute for a command line argument or other shell variable.

References

  1. ^ "The sed FAQ, Section 2.1". Retrieved 2013-05-21.
  2. ^ "The sed FAQ, Section 2.2". Retrieved 2013-05-21.
  3. ^ a b McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  4. ^ a b c d "On the Early History and Impact of Unix". A while later a demand arose for another special-purpose program, gres, for substitution: g/re/s. Lee McMahon undertook to write it, and soon foresaw that there would be no end to the family: g/re/d, g/re/a, etc. As his concept developed it became sed…
  5. ^ "Implementation of a Turing Machine as Sed Script".
  6. ^ "Turing.sed".
  7. ^ "The $SED Home - gamez".
  8. ^ "bolknote/SedChess". GitHub.
  9. ^ "Sedtris, a Tetris game written for sed".

Further reading

External links

Tutorials

Examples

Other links