고요한

sed
고요한
패러다임스크립팅
설계자리 맥마흔
첫 등장1974년; 48년 전 (1998년)
구현 언어C
웹사이트www.gnu.org/software/sed/
영향을 받은
에이드
영향받은
, AWK

sed("stream Editor")는 단순하고 컴팩트한 프로그래밍 언어를 사용하여 텍스트를 파싱하고 변환하는 Unix 유틸리티다.세드는 1973년부터 1974년까지 벨 연구소Lee E. McMahon에 의해 개발되었으며 오늘날 대부분의 운영 체제에서 사용할 수 있다.[1][2]sed는 대화형 편집기 ed("interactive", 1971)와 이전 qed("quick editor", 1965–66)의 스크립팅 기능을 기반으로 했다.sed는 정규식을 지원하는 가장 초기 도구 중 하나였으며, 특히 대체 명령어와 함께 텍스트 처리에 사용되고 있다.일반 텍스트 문자열 조작 및 "스트림 편집"을 위한 대체 도구로는 AWKPerl이 있다.

역사

Version 7 Unix에 처음 등장한 [3]sed는 데이터 파일의 명령줄 처리를 위해 만들어진 초기 Unix 명령 중 하나이다.인기 있는 grep 사령부의 자연스러운 후계자로 진화했다.[4]원래의 동기는 대체에 대한 grep (g/re/p)의 아날로그였기 때문에 "g/re/s"이다.[3]맥마흔은 g/re/d와 같이 각 명령어에 대한 추가적인 특수 목적 프로그램도 발생할 것으로 예상하면서 범용 라인 지향 스트림 편집기를 썼고, 이것이 진정되었다.[4]Sed에 대한 구문, 특히 의 사용./패턴 매칭s///대체는, ed에서 유래한 것으로, 당시 일반적으로 사용되었던 sed의 전구체,[4] 그리고 정규식 구문이 특히 ECMascriptPerl 등 다른 언어에 영향을 주었다.후에 더 강력한 언어 AWK가 개발되었고, 이것들은 사촌 역할을 하여 셸 스크립트에 의해 강력한 텍스트 처리가 가능해졌다.sed와 AWK는 Perl의 조제자 및 영감으로 자주 인용되며, 특히 매칭 및 대체 연산자에서 Perl의 구문과 의미론에 영향을 주었다.

GNU sed는 파일의 인플레이스 편집을 포함한 몇 가지 새로운 기능을 추가했다.Super-sedPerl과 호환되는 정규 표현이 포함된 확장형 Sed이다.또 다른 변종의 세드는 을 낸다. 원래 4.1부터 역엔지니어링되었다.Eric S에 의해 진정된 BSD. 레이먼드(Raymond)와 현재 르네 레베에 의해 유지되고 있다.미네이트는 GNU 프로젝트가 새로운 GNU 정규표현 라이브러리에 기초하여 새로운 버전의 sed를 작성할 때까지 GNU 프로젝트에 의해 사용되었다.현재 mined는 BSD sed에 대한 일부 확장을 포함하고 있지만 GNU sed만큼 기능이 풍부하지는 않다.속도가 매우 빠르고 기억력도 거의 사용하지 않는 것이 장점이다.[citation needed]임베디드 시스템에 사용되며, 미닉스와 함께 제공되는 세드의 버전이다.[citation needed]

운전모드

sed는 선 지향적인 텍스트 처리 유틸리티로, 입력 스트림이나 파일에서 패턴 스페이스라고 불리는 내부 버퍼로 텍스트를 읽는다.각 줄 읽기는 사이클을 시작한다.패턴 공간에, sed는 sed 스크립트를 통해 지정된 하나 이상의 작업을 적용한다.sed는 텍스트에 연산을 지정하는 약 25개의 명령으로 프로그래밍 언어를 구현한다.각 입력 라인에 대해 스크립트를 실행한 후 일반적으로 패턴 공간(스크립트에 의해 수정된 라인)을 출력하고 다음 라인으로 다시 사이클을 시작한다.다른 엔드-오브스크립트 동작은 예를 들어 sed 옵션과 스크립트 명령을 통해 이용할 수 있다.d패턴 공간을 삭제하려면q그만둬라,N패턴 공간에 다음 줄을 즉시 추가하는 등따라서 sed 스크립트는 흐름의 선을 통해 반복되는 루프의 본체에 해당하며, 여기서 루프 자체와 루프 변수(현재 라인 번호)는 sed에 의해 암시되고 유지된다.

sed 스크립트는 명령줄에서 지정할 수 있음(-e옵션) 또는 별도의 파일에서 읽기(-f옵션).sed 스크립트의 명령은 행 번호나 정규 표현식의 측면에서 선택적 주소를 사용할 수 있다.어드레스는 명령어 실행 시기를 결정한다.예를 들어,2d단지 그 일을 할 것이다.d(삭제) 두 번째 입력 라인의 명령어(두 번째 입력 라인을 제외한 모든 라인 포함)/^ /d 공백으로 시작하는 모든 줄을 삭제한다.별도의 특수 버퍼인 홀드 스페이스를 몇 개의 sed 명령으로 사용하여 사이클 사이에 텍스트를 고정하고 누적할 수 있다.sed의 명령어는 두 변수("홀드 스페이스"와 "패턴 스페이스")와 GOTO와 같은 분기 기능만 가지고 있다. 그럼에도 불구하고 언어는 튜링-완전하며,[5][6] 소코반, 아르카노이드,[7] 체스,[8] 테트리스 등의 게임에는 난해한 sed 스크립트가 존재한다.[9]

메인 루프는 입력 스트림의 각 라인에 대해 실행되며, 입력의 각 라인에서 sed 스크립트를 평가한다.sed 스크립트의 행은 각각 패턴-액션 쌍으로, 어떤 패턴과 일치시킬지, 어떤 동작을 수행할지를 나타내며, 조건문으로 다시 작성할 수 있다.메인 루프, 작업 변수(패턴 공간 및 홀드 공간), 입력 및 출력 스트림, 기본 동작(패턴 공간에 대한 복사선, 인쇄 패턴 공간) 등이 암묵적이기 때문에 테르스 원라이너 프로그램 작성이 가능하다.예를 들어, 다음과 같은 방법으로 제공된 SED 프로그램:

10q

처음 10줄의 입력 후 정지한다.

사용법

대체 명령어

다음 예제는 대표적인, 그리고 가장 일반적인, 대체 세트의 사용을 보여준다.이러한 사용은 실제로 침대를 위한 원래 동기가 되었다.[4]

sed '/regexp/대체/g' inputFileName > outputFileName

어떤 버전의 세드에서는 그 표현이 선행되어야 한다.-e어떤 표현이 뒤따른다는 것을 나타내기 위해서.s대체를 의미하며, 반면g글로벌(global)을 나타내며, 이는 라인의 모든 일치하는 발생이 교체됨을 의미한다.검색할 정규식(즉, 패턴)은 첫 번째 구분 기호(여기서 슬래시) 뒤에 배치되며, 대체는 두 번째 기호를 따른다.슬래시()./)는 종래의 기호로서, ed의 "검색"을 위한 문자에서 유래하지만, 다른 어떤 기호도 구문이 패턴이나 대체에서 발생하지 않을 경우 구문을 더 읽기 쉽게 만드는 데 사용될 수 있다. 이것은 "이쑤시개 증후군"을 피하는 데 유용하다.

ed의 검색 및 교체에서 발생하는 대체 명령어는 간단한 구문 분석과 템플리트를 구현한다.regexp패턴 매칭과 하위 메뉴를 통한 텍스트 저장 기능을 모두 제공하는 한편replacement리터럴 텍스트 또는 문자를 포함하는 형식 문자열일 수 있음&"일치 일치" 또는 특수 탈출 시퀀스 \1을 통해\9N번째 저장된 하위 파일용.예를 들어,sed -r "s/(cat dog)s?/\1s/g"기존 "s"를 복제하지 않고 "cat" 또는 "dog"의 모든 발생을 "cat" 또는 "dog"로 대체한다.(cat dog)regexp에서 1번째(및 유일한) 저장된 하위 테이블이며,\1형식 문자열에서 이것을 출력물로 대체한다.

기타 sed 명령

대체 외에도, 25개의 sed 명령을 사용하여 다른 형태의 간단한 처리가 가능하다.예를 들어, 다음은 d 명령을 사용하여 공백만 포함하거나 줄 끝 문자만 포함하는 줄을 필터링한다.

sed '/^ *$/d' inputFileName

이 예는 다음과 같은 정규식 메타카락터(sed는 정규식의 전체 범위를 지원한다) 중 일부를 사용한다.

  • 캐럿().^)는 줄의 시작과 일치한다.
  • 달러 기호 ($)는 선의 끝과 일치한다.
  • 별표().*)는 이전 문자의 0개 이상의 항목과 일치한다.
  • 플러스(+)+)는 이전 문자의 하나 이상의 항목과 일치한다.
  • 물음표().?)는 이전 문자의 0 또는 1개 항목과 일치한다.
  • ().)는 정확히 하나의 문자와 일치한다.

복잡한 세드 구성이 가능해 단순하지만 고도로 전문화된 프로그래밍 언어의 역할을 할 수 있다.예를 들어, 제어 흐름은 라벨(줄 뒤에 콜론)과 분기 명령을 사용하여 관리할 수 있다.b. 지시b그 다음에 유효한 라벨 이름이 있으면 해당 라벨 다음에 있는 블록으로 처리가 이동된다.

여과기로 쓰이는 세드

Unix에서 sed는 종종 파이프라인에서 필터로 사용된다.

데이터 SED 's/x/y/g' 생성

즉, "generateData"와 같은 프로그램이 데이터를 생성하고, 이어 sed가 xy로 교체하는 작은 변화를 만든다.예를 들면 다음과 같다.

$ 에코 xyz xyz sed 's/x/y/g' yyz yyz

[주 1]

파일 기반 SED 스크립트

한 줄에 한 명령씩 여러 개의 sed 명령을 다음과 같은 스크립트 파일에 넣는 것이 종종 유용하다.subst.sed, 그런 다음-f명령 실행 옵션(예:s/x/y/g파일에서:

sed -f 변전소sed inputFileName > outputFileName

스크립트 파일에는 임의의 수의 명령이 배치될 수 있으며, 스크립트 파일을 사용하면 셸이 빠져 나오거나 대체되는 문제도 방지할 수 있다.

이러한 스크립트 파일은 sed 명령이 포함된 "shebang line"으로 미리 작성하고 파일에 실행 가능한 권한을 할당하여 명령줄에서 직접 실행 가능하도록 만들 수 있다.예를 들어 파일subst.sed컨텐츠로 생성 가능:

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

그런 다음 현재 사용자가 파일을 실행 가능하게 만들 수 있다.chmod명령:

chmod u+x 변전소.고요한

그런 다음 명령줄에서 직접 파일을 실행할 수 있다.

sub.sed inputFileName > outputFileName

인플레이스 편집

-iGNU sed에 도입된 옵션은 파일의 인플레이스 편집을 허용한다(실제로 백그라운드에서 임시 출력 파일이 생성되고, 그 다음 원본 파일이 임시 파일로 대체된다).예를 들면 다음과 같다.

sed -i '/abc/def/' fileName

안녕, 월드! 예시

# 입력 텍스트 스트림을 "Hello, world!"s/.*/Hello, world!/ q로 변환

"Hello, world!" 스크립트는 파일에 있다(예: 스크립트).txt) 및 로 호출됨sed -f script.txt inputFileName여기서 "inputFileName"은 입력 텍스트 파일이다.스크립트는 "inputFileName" 라인 #1을 "Hello, world!"로 변경한 후 종료하고, sed가 종료되기 전에 결과를 인쇄한다.#1 행을 지나는 입력 라인은 판독되지 않으며 인쇄되지 않는다.그래서 유일한 결과물은 "안녕, 세계야!" 입니다.

이 예는 세드의 많은 주요 특성을 강조한다.

  • 전형적인 SED 프로그램은 다소 짧고 간단하다.
  • sed 스크립트에는 코멘트가 있을 수 있음("로 시작하는 줄")#기호).
  • s명령어는 가장 중요한 sed 명령어다.
  • sed는 다음과 같은 명령으로 간단한 프로그래밍을 허용한다.q(미리)
  • sed는 다음과 같은 규칙적인 표현을 사용한다..*(모든 문자를 0개 이상 포함)

기타 간단한 예

아래는 다양한 Sed 스크립트를 따르십시오. 이러한 스크립트를 Sed에 인수로 전달하여 실행하거나 별도의 파일에 저장하여 다음을 통해 실행하십시오.-f또는 스크립트 자체를 실행 가능으로 설정함으로써.

파일에 있는 특정 단어의 인스턴스를 IRC 암호와 같은 "REDACTED"로 바꾸고 결과를 저장하려면:

sed -i s/your password/REDACTED/ ./status.chat.log

"yourword"라는 단어가 포함된 행을 삭제하려면(주소는 '/yourword/'임).

/yourword/d

단어 "yourword"의 모든 인스턴스를 삭제하려면:

s/your word/g

파일에서 두 단어를 동시에 삭제하려면:

s/첫마디/g s/두마디/g

명령행에 입력할 때와 같이 앞의 예를 한 줄에 표시하기 위해 세미콜론을 통해 두 개의 명령을 결합할 수 있다.

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

멀티라인 처리 예제

다음 예에서, 보통 한 줄에서만 작동하는 sed는 두 번째 줄이 하나의 공백으로 시작하는 문장에서 새로운 줄을 제거한다.다음 텍스트를 고려하십시오.

이 개는 내 개인데 이름은 프랭크야.이 물고기는 내 물고기야. 이름은 조지야.이것은 내 염소인데, 그의 이름은 아담이다. 

아래의 sed 스크립트는 위의 텍스트를 다음과 같은 텍스트로 변환할 것이다.스크립트는 공백으로 시작하는 입력 라인에만 영향을 준다는 점에 유의하십시오.

이 개는 내 개인데 이름은 프랭크야.이 물고기는 내 물고기야. 이름은 조지야.이것은 내 염소인데, 그의 이름은 아담이다. 

스크립트는 다음과 같다.

N s/\n / P D

이는 다음과 같이 설명된다.

  • (N) 패턴 공간에 다음 줄을 추가한다.
  • (s/\n / /) 새로운 선 다음에 공백이 오는 새로운 선을 찾아 하나의 공간으로 대체한다.
  • (P) 패턴 공간의 맨 위 줄을 인쇄한다.
  • (D) 패턴 공간에서 상단 라인을 삭제하고 스크립트를 다시 실행한다.

이것은 세미콜론을 통해 한 줄로 표현할 수 있다.

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

한계 및 대안

단순하고 제한적이지만, 세드는 많은 목적을 위해 충분히 강력하다.보다 정교한 처리를 위해 AWKPerl과 같은 보다 강력한 언어가 대신 사용된다.이것들은 특히, 임의적으로 복잡한 변환은 원칙적으로 홀드 버퍼를 사용하여 가능하지만, regex 추출 및 템플릿 교체보다 더 복잡한 방법으로 선을 변환하는 경우에 사용된다.

반대로, 보다 간단한 작업을 위해서는 grep(패턴과 일치하는 인쇄 선), head(파일의 첫 번째 부분 인쇄), tail(파일의 마지막 부분 인쇄), tr(문자 변환 또는 삭제)과 같은 전문 Unix 유틸리티가 선호되는 경우가 많다.그들이 수행하도록 고안된 특정 작업의 경우, 그러한 전문화된 유틸리티는 일반적으로 세드와 같은 보다 일반적인 솔루션보다 간단하고, 명확하며, 빠르다.

ed/sed 명령어와 구문은 텍스트 편집기 vivim과 같은 하위 프로그램에서 계속 사용된다.ed/sd와 아날로그는 sam/sam으로, 여기서 sam은 Plan 9 에디터, 쌈은 그에 대한 스트림 인터페이스로, sed와 유사한 기능을 제공한다.

참고 항목

메모들

  1. ^ 명령줄 사용에서 표현식 주위의 따옴표는 필요하지 않으며, 그렇지 않으면 셸이 표현식을 하나의 단어(토큰)로 해석하지 않는 경우에만 필요하다.대본용s/x/y/g애매한 것은 없으니generateData sed s/x/y/g제대로 작동한다.그러나 인용문은 일반적으로 명료성을 위해 포함되며 특히 공백(예: 백스페이스)에 필요한 경우가 많다.'s/x x/y y/'셸이 해석되는 것을 피하기 위해 대부분 작은 따옴표를 사용한다.$껍데기 변수로다음과 같이 큰따옴표를 사용한다."s/$1/$2/g"셸이 명령줄 인수 또는 다른 셸 변수를 대체하도록 허용.

참조

  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".

추가 읽기

외부 링크

자습서

기타 링크