
미친 소리지만 Linux sed command는 인터페이스가없는 텍스트 편집기입니다. 명령 행에서이를 사용하여 파일 및 스트림의 텍스트를 조작 할 수 있습니다. 우리는 그 힘을 활용하는 방법을 보여줄 것입니다.
sed의 힘
그만큼 sed 명령은 체스와 비슷합니다. 기본을 배우는 데 1 시간이 걸리고 마스터하는 데는 평생이 필요합니다 (또는 적어도 많은 연습). 우리는 각각의 주요 카테고리에서 오픈 bit 빗의 선택을 보여줄 것입니다. sed 기능.
sed 파이프 입력 또는 텍스트 파일에서 작동하는 스트림 편집기입니다. 그러나 대화식 텍스트 편집기 인터페이스는 없습니다. 대신 텍스트를 통해 작업 할 때 따라야 할 지침을 제공합니다. 이것은 모두 Bash 및 기타 명령 줄 셸에서 작동합니다.
와 sed 다음을 모두 수행 할 수 있습니다.
- 텍스트를 선택하십시오
- 대체 텍스트
- 텍스트에 줄 추가
- 텍스트에서 줄 삭제
- 원본 파일 수정 (또는 보존)
우리는 예제를 구성하여 개념을 소개하고 시연하고 가장 간결하고 (가장 접근하기 어려운) 생산하지 않았습니다. sed 명령. 그러나 패턴 일치 및 텍스트 선택 기능은 sed 정규식 (정규식)에 크게 의존합니다. 최대한 활용하기 위해서는 이것에 대해 어느 정도 익숙해야합니다. sed.
관련 : Linux에서 정규식 (정규)을 사용하는 방법
간단한 예
먼저 우리는 echo 텍스트를 보내려면 sed 파이프를 통해 sed 텍스트의 일부를 대체하십시오. 이렇게하려면 다음을 입력하십시오.
echo howtogonk | sed 's/gonk/geek/'
그만큼 echo 명령은 “howtogonk”를 sed간단한 대체 규칙 ( “s”는 대체를 나타냄)이 적용됩니다. sed 첫 번째 문자열의 발생을 입력 텍스트에서 검색하고 일치하는 항목을 두 번째 문자열로 바꿉니다.
“gonk”문자열이“geek”으로 바뀌고 새 문자열이 터미널 창에 인쇄됩니다.

대체는 아마도 가장 일반적인 용도 일 것입니다. sed. 하지만 대체를 심층적으로 살펴보기 전에 텍스트를 선택하고 일치시키는 방법을 알아야합니다.
텍스트 선택
예제를 위해 텍스트 파일이 필요합니다. 사무엘 테일러 콜리지 (Samuel Taylor Coleridge)의 유명한시“고대 마리너의 서빙”의 구절이 포함 된 구절을 사용할 것입니다.
우리는 그것을 살펴보기 위해 다음을 입력합니다. less:
less coleridge.txt

파일에서 일부 줄을 선택하기 위해 선택하려는 범위의 시작 및 끝 줄을 제공합니다. 단일 번호는 한 줄을 선택합니다.
1 ~ 4 행을 추출하려면 다음 명령을 입력하십시오.
sed -n '1,4p' coleridge.txt
사이에 쉼표를 적어 둡니다. 1 과 4. 그만큼 p “일치하는 줄 인쇄”를 의미합니다. 기본적으로, sed 모든 줄을 인쇄합니다. 파일에 일치하는 줄이 두 번 인쇄 된 모든 텍스트가 표시됩니다. 이를 방지하기 위해 -n 일치하지 않는 텍스트를 억제하는 (자동) 옵션.
우리는 줄 번호를 변경하여 아래와 같이 다른 구절을 선택할 수 있습니다.
sed -n '6,9p' coleridge.txt

우리는 사용할 수 있습니다 -e (표현) 옵션으로 여러 항목을 선택할 수 있습니다. 두 개의 표현으로 다음과 같이 두 구절을 선택할 수 있습니다.
sed -n -e '1,4p' -e '31,34p' coleridge.txt
두 번째 표현식에서 첫 번째 숫자를 줄이면 두 구절 사이에 공백을 삽입 할 수 있습니다. 우리는 다음을 입력합니다 :
sed -n -e '1,4p' -e '30,34p' coleridge.txt

우리는 또한 출발 선을 선택하고 말할 수 있습니다 sed 파일을 단계별로 실행하고 매 5 행마다 대체 행을 인쇄하거나 임의의 수의 행을 생략합니다. 이 명령은 범위를 선택하기 위해 위에서 사용한 것과 유사합니다. 하지만 이번에는 물결표 (~) 대신 쉼표 대신 숫자를 구분하십시오.
첫 번째 숫자는 출발 선을 나타냅니다. 두 번째 숫자는 sed 시작 줄 다음에 어떤 줄이 있는지보고 싶습니다. 숫자 2는 두 번째 줄마다, 3은 세 번째 줄마다를 의미합니다.
우리는 다음을 입력합니다 :
sed -n '1~2p' coleridge.txt

찾고있는 텍스트가 파일에서 어디에 있는지 항상 알 수는 없습니다. 즉, 줄 번호가 항상 큰 도움이되지는 않습니다. 그러나, 당신은 또한 사용할 수 있습니다 sed 일치하는 텍스트 패턴이 포함 된 줄을 선택합니다. 예를 들어 “And”로 시작하는 모든 줄을 추출해 봅시다.
캐럿 (^)는 줄의 시작을 나타냅니다. 검색어를 슬래시 (/). 또한 “And”뒤에 공백이 있으므로 “Android”와 같은 단어는 결과에 포함되지 않습니다.
독서 sed 처음에는 스크립트가 약간 어려울 수 있습니다. 그만큼 /p 위에서 사용한 명령에서와 마찬가지로 “인쇄”를 의미합니다. 그러나 다음 명령에서 슬래시가 앞에옵니다.
sed -n '/^And /p' coleridge.txt

“And”로 시작하는 세 줄이 파일에서 추출되어 표시됩니다.
대체 만들기
첫 번째 예에서는 다음과 같은 기본 형식을 보여주었습니다. sed 치환:
echo howtogonk | sed 's/gonk/geek/'
그만큼 s 알려줍니다 sed 이것은 대체입니다. 첫 번째 문자열은 검색 패턴이고 두 번째 문자열은 일치하는 텍스트를 바꾸려는 텍스트입니다. 물론, 리눅스의 모든 것들과 마찬가지로 악마는 세부 사항에 있습니다.
우리는“일”의 모든 발생을“주”로 변경하고 선원과 알바트 로스가 더 많은 유대를 맺을 시간을주기 위해 다음을 입력합니다.
sed -n 's/day/week/p' coleridge.txt
첫 번째 줄에서는 “일”의 두 번째 항목 만 변경됩니다. 이 때문입니다 sed 라인 당 첫 번째 일치 후에 중지합니다. 각 줄의 모든 일치 항목이 처리되도록 전역 검색을 수행하려면 아래에 표시된 것처럼 표현식 끝에 “g”를 추가해야합니다.
sed -n 's/day/week/gp' coleridge.txt
이것은 첫 번째 줄에서 4 개 중 3 개와 일치합니다. 첫 번째 단어는“Day”이고 sed 대소 문자를 구분하므로 해당 인스턴스를 '일'과 동일하게 간주하지 않습니다.
다음을 입력하여 i 대소 문자 구분을 나타 내기 위해 표현식 끝의 명령에
sed -n 's/day/week/gip' coleridge.txt
이것은 효과가 있지만 항상 모든 것에 대소 문자를 구분하지 않으려 고 할 수도 있습니다. 이러한 경우 정규식 그룹을 사용하여 패턴 별 대 / 소문자 구분을 추가 할 수 있습니다.
예를 들어 문자를 대괄호 (())는 '이 문자 목록의 모든 문자'로 해석됩니다.
우리는 다음을 입력하고 “D”와 “d”를 그룹에 포함시켜 “Day”와 “day”와 일치하는지 확인합니다.
sed -n 's/(Dd)ay/week/gp' coleridge.txt

대체를 파일 섹션으로 제한 할 수도 있습니다. 첫 번째 구절에 파일에 이상한 간격이 있다고 가정 해 봅시다. 다음과 같은 익숙한 명령을 사용하여 첫 번째 구절을 볼 수 있습니다.
sed -n '1,4p' coleridge.txt
두 개의 공백을 검색하여 하나의 공백으로 대체합니다. 전 세계적으로이 작업을 수행하여 전체 라인에서 작업이 반복됩니다. 명확하게, 검색 패턴은 공간, 공간 별표 (*)로 대체 문자열은 단일 공백입니다. 그만큼 1,4 대체를 파일의 처음 네 줄로 제한합니다.
우리는이 모든 것을 다음 명령에 정리했습니다.
sed -n '1,4 s/ */ /gp' coleridge.txt
이것은 잘 작동합니다! 여기서는 검색 패턴이 중요합니다. 별표 (*)은 공백 인 선행 문자 중 0 개 이상을 나타냅니다. 따라서 검색 패턴은 하나 이상의 공백 문자열을 찾습니다.
일련의 여러 공백을 하나의 공백으로 대체하면 각 단어 사이에 공백이 한 개씩 파일을 일정한 간격으로 되돌립니다. 경우에 따라 단일 공간을 단일 공간으로 대체 할 수도 있지만 이는 악영향을 미치지 않으며 원하는 결과를 얻을 수 있습니다.
다음을 입력하고 검색 패턴을 단일 공백으로 줄이면 두 개의 공백을 포함해야하는 이유를 즉시 알 수 있습니다.
sed -n '1,4 s/ */ /gp' coleridge.txt

별표는 앞의 문자 중 0 개 이상과 일치하므로 공백이 아닌 각 문자를 “제로 공백”으로보고 대체를 적용합니다.
그러나 검색 패턴에 공백이 두 개 있으면 sed 대체를 적용하기 전에 하나 이상의 공백 문자를 찾아야합니다. 이렇게하면 공백이 아닌 문자는 그대로 유지됩니다.
우리는 다음을 사용하여 다음을 입력합니다. -e (표현) 앞에서 사용한 두 개 이상의 치환을 동시에 할 수 있습니다.
sed -n -e 's/motion/flutter/gip' -e 's/ocean/gutter/gip' coleridge.txt
세미콜론을 사용하면 동일한 결과를 얻을 수 있습니다 (;) the 두 표현식을 다음과 같이 구분하십시오.
sed -n 's/motion/flutter/gip;s/ocean/gutter/gip' coleridge.txt

다음 명령에서“day”를“week”로 바꾸었을 때“well a-day”표현에서“day”인스턴스도 교체되었습니다.
sed -n 's/(Dd)ay/week/gp' coleridge.txt
이를 방지하기 위해 다른 패턴과 일치하는 행에서만 대체를 시도 할 수 있습니다. 시작시 검색 패턴을 갖도록 명령을 수정하면 해당 패턴과 일치하는 줄에서만 작업하는 것이 좋습니다.
다음을 입력하여 일치 패턴을 “after”라는 단어로 만듭니다.
sed -n '/after/ s/(Dd)ay/week/gp' coleridge.txt
그것은 우리에게 우리가 원하는 응답을 제공합니다.

더 복잡한 대체
Coleridge에게 휴식을 취하고 사용합시다 sed 에서 이름을 추출 etc/passwd 파일.
이를 수행하는 방법은 짧지 만 (나중에 자세히 설명), 여기서는 다른 개념을 설명하기 위해 더 긴 방법을 사용합니다. 검색 패턴에서 일치하는 각 항목 (하위 표현식이라고 함)에 번호를 매길 수 있습니다 (최대 9 개 항목까지). 그런 다음이 번호를 sed 특정 하위 표현식을 참조하는 명령.
하위 표현식을 괄호로 묶어야합니다 (())이 작동합니다. 괄호 앞에는 백 슬래시가 와야합니다 ()가 일반 문자로 취급되지 않도록합니다.
이렇게하려면 다음을 입력하십시오.
sed 's/((^:)*).*/1/' /etc/passwd

이것을 분해하자 :
-
sed 's/: 그만큼sed명령 및 대체 표현식의 시작. -
(: 여는 괄호 (() 앞에 역 슬래시 (). -
(^:)*: 검색어의 첫 번째 하위 표현식에는 대괄호로 묶인 그룹이 포함됩니다. 캐럿 (^)은 그룹에서 사용될 때 “없음”을 의미합니다. 그룹은 콜론이 아닌 모든 문자 (:)가 일치합니다. -
): 닫는 괄호 ()) 앞에 백 슬래시 (). -
.*: 이 두 번째 검색 하위 표현식은 “모든 문자 및 그 수”를 의미합니다. -
/1: 식의 치환 부분은1앞에 백 슬래시 (). 첫 번째 하위 표현식과 일치하는 텍스트를 나타냅니다. -
/': 닫는 슬래시 (/) 및 작은 따옴표 (')를 종료sed명령.
이것이 의미하는 바는 콜론을 포함하지 않는 문자열을 찾아야한다는 것입니다 (:), 일치하는 텍스트의 첫 번째 인스턴스가됩니다. 그런 다음 해당 줄에서 다른 항목을 검색합니다. 이는 일치하는 텍스트의 두 번째 인스턴스입니다. 전체 줄을 첫 번째 하위 표현과 일치하는 텍스트로 대체합니다.
의 각 줄 /etc/passwd 파일은 콜론으로 끝나는 사용자 이름으로 시작합니다. 우리는 모든 것을 첫 번째 콜론에 맞추고 그 값을 전체 줄로 바꿉니다. 그래서 우리는 사용자 이름을 분리했습니다.

다음으로 두 번째 하위 표현식을 괄호로 묶습니다 (()) 따라서 숫자로도 참조 할 수 있습니다. 우리는 또한 교체합니다 1 와 2. 우리의 명령은 이제 전체 줄을 첫 번째 콜론의 모든 줄로 대체합니다.:)를 줄 끝까지.
우리는 다음을 입력합니다 :
sed 's/((^:)*)(.*)/2/' /etc/passwd

이러한 작은 변경 사항은 명령의 의미를 반전시키고 사용자 이름을 제외한 모든 것을 얻습니다.

이제이 작업을 빠르고 쉽게 수행 할 수있는 방법을 살펴 보겠습니다.
검색어는 첫 번째 콜론 (:)를 줄 끝까지. 대체 표현이 비어 있기 때문에 (//) 일치하는 텍스트를 대체하지 않습니다.
따라서 첫 번째 콜론에서 모든 것을 잘라내어 다음을 입력합니다.:) 줄 끝까지 사용자 이름 만 남겨 둡니다.
sed 's/:.*//" /etc/passwd

동일한 명령에서 첫 번째와 두 번째 일치 항목을 참조하는 예를 살펴 보겠습니다.
쉼표 파일이 있습니다 (,) 이름과 성을 분리합니다. 우리는 그것들을“성, 이름”으로 나열하고 싶습니다. 사용할 수있다 cat아래에 표시된대로 파일에 무엇이 있는지 확인하십시오.
cat geeks.txt
많은 것처럼 sed 다음 명령은 처음에는 뚫을 수없는 것처럼 보일 수 있습니다.
sed 's/^(.*),(.*)$/2,1 /g' geeks.txt

이것은 우리가 사용한 다른 것과 같은 대체 명령이며 검색 패턴은 매우 쉽습니다. 다음과 같이 세분화합니다.
-
sed 's/: 정상적인 대체 명령입니다. -
^: 캐럿이 그룹에 있지 않기 때문에 (()), “줄의 시작”을 의미합니다. -
(.*),: 첫 번째 하위 표현식은 임의의 수의 문자입니다. 괄호로 묶습니다 (()), 각각 앞에 백 슬래시 () 번호로 참조 할 수 있습니다. 지금까지의 전체 검색 패턴은 줄의 시작부터 첫 번째 쉼표 (,)에 제한이 없습니다. -
(.*): 다음 하위 표현은 문자의 수에 관계없이 (다시)입니다. 또한 괄호로 묶여 있습니다 (()), 둘 다 백 슬래시 () 일치하는 텍스트를 숫자로 참조 할 수 있습니다. -
$/: 달러 기호 ($)는 줄의 끝을 나타내며 줄 끝까지 검색을 계속할 수 있습니다. 우리는 이것을 단순히 달러 기호를 소개하는 데 사용했습니다. 별표로 여기 필요하지 않습니다 (*)는이 시나리오에서 줄 끝으로 이동합니다. 슬래시 (/)가 검색 패턴 섹션을 완료합니다. -
2,1 /g': 우리는 두 개의 하위 표현식을 괄호로 묶었으므로 두 숫자를 모두 참조 할 수 있습니다. 우리는 순서를 바꾸고 싶기 때문에second-match,first-match. 숫자 앞에는 백 슬래시 (). -
/g: 이를 통해 우리의 명령은 각 라인에서 전 세계적으로 작동합니다. -
geeks.txt: 우리가 작업중인 파일입니다.
잘라 내기 명령을 사용할 수도 있습니다 (c)를 사용하여 검색 패턴과 일치하는 전체 줄을 대체하십시오. 다음과 같이 입력하여 단어 “neck”이있는 줄을 검색하여 새 문자열로 바꿉니다.
sed '/neck/c Around my wrist was strung' coleridge.txt

이제 새 줄이 추출의 맨 아래에 나타납니다.

줄과 텍스트 삽입
새 줄과 텍스트를 파일에 삽입 할 수도 있습니다. 일치하는 줄 다음에 줄 바꿈을 추가하려면 추가 명령 (a).
작업 할 파일은 다음과 같습니다.
고양이 geeks.txt

우리는 이것을 쉽게 따라갈 수 있도록 줄 번호를 매겼습니다.
다음을 입력하여 단어 “He”가 포함 된 줄을 검색하고 그 아래에 새 줄을 삽입합니다.
sed '/He/a --> Inserted!' geeks.txt
삽입되었습니다! ' geeks.txt “터미널에서 명령.” width = “646”height = “262”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
다음을 입력하고 Insert Command (i)를 사용하여 일치하는 텍스트가 포함 된 줄 위에 새 줄을 삽입하십시오.
sed '/He/i --> Inserted!' geeks.txt
삽입되었습니다! ' geeks.txt “터미널에서 명령.” width = “646”height = “262”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
앰퍼샌드 (&)는 일치하는 줄에 새 텍스트를 추가하기 위해 원래 일치하는 텍스트를 나타냅니다. 1 , 2등은 일치하는 하위 표현식을 나타냅니다.
줄의 시작 부분에 텍스트를 추가하기 위해 새로운 텍스트를 원래 줄과 결합하는 대체 절과 함께 줄의 모든 항목과 일치하는 대체 명령을 사용합니다.
이 모든 작업을 수행하려면 다음을 입력하십시오.
sed 's/.*/--> Inserted &/' geeks.txt
터미널 창에 & / 'geeks.txt “명령을 삽입했습니다.” width = “646”height = “212”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
다음을 포함하여 다음을 입력합니다. G 각 줄 사이에 빈 줄을 추가합니다.
sed 'G' geeks.txt

빈 줄을 두 개 이상 추가하려면 G;G, G;G;G, 등등.
라인 삭제
삭제 명령 (d)는 검색 패턴과 일치하거나 행 번호 또는 범위로 지정된 행을 삭제합니다.
예를 들어 세 번째 줄을 삭제하려면 다음을 입력하십시오.
sed '3d' geeks.txt
4 ~ 5 행 범위를 삭제하려면 다음을 입력합니다.
sed '4,5d' geeks.txt
범위 밖의 선을 삭제하려면 느낌표 (!), 아래 그림과 같이:
sed '6,7!d' geeks.txt

변경 사항 저장
지금까지 모든 결과가 터미널 창에 인쇄되었지만 아직 아무 곳에도 저장하지 않았습니다. 이를 영구적으로 만들려면 변경 내용을 원본 파일에 쓰거나 새 파일로 리디렉션 할 수 있습니다.
원본 파일을 덮어 쓰려면 약간의주의가 필요합니다. 당신의 경우 sed 명령이 잘못되었습니다. 실행 취소하기 어려운 원본 파일을 약간 변경했을 수 있습니다.
마음의 평화를 위해 sed 명령을 실행하기 전에 원본 파일의 백업을 만들 수 있습니다.
전체 옵션 (-i) 말하다 sed 원본 파일에 변경 사항을 기록하지만 파일 확장자를 추가하면 sed 원본 파일을 새 파일로 백업합니다. 파일 이름은 원본 파일과 동일하지만 파일 확장자가 새 것입니다.
시연을 위해“He”라는 단어가 포함 된 행을 검색하여 삭제합니다. 또한 BAK 확장자를 사용하여 원본 파일을 새 파일로 백업합니다.
이 모든 작업을 수행하려면 다음을 입력하십시오.
sed -i'.bak' '/^.*He.*$/d' geeks.txt
백업 파일이 변경되지 않도록 다음을 입력합니다.
cat geeks.txt.bak

다음을 입력하여 출력을 새 파일로 리디렉션하고 비슷한 결과를 얻을 수 있습니다.
sed -i'.bak' '/^.*He.*$/d' geeks.txt > new_geeks.txt
우리는 사용 cat 아래와 같이 변경 사항이 새 파일에 기록되었는지 확인하십시오.
cat new_geeks.txt
new_geeks.txt “및”터미널 창에서 “cat new_geeks.txt”명령 ” width = “646”height = “307”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
그 모든 것을 sed
아시다시피이 빠른 입문서도 sed 꽤 길다. 이 명령에는 많은 것이 있으며, 더 많은 것을 할 수 있습니다.
그러나 이러한 기본 개념이 계속 배우면서 더 많은 것을 배울 수있는 견고한 토대를 제공했으면합니다.








