Linux에서 sed 명령을 사용하는 방법

이상하게 들릴 수 있지만 Linux sed명령은 인터페이스가없는 텍스트 편집기입니다. 명령 줄에서이를 사용하여 파일 및 스트림의 텍스트를 조작 할 수 있습니다. 그 힘을 활용하는 방법을 보여 드리겠습니다.

sed의 힘

sed(연습 적어도 많은, 또는) 그들을 마스터하기 위해 기본과 평생 학습 시간을 취 명령은 체스와 같은 비트입니다. 각 주요 sed기능 범주에서 시작하는 갬빗의 선택을 보여 드리겠습니다 .

sed파이프 된 입력 또는 텍스트 파일에서 작동하는 스트림 편집기입니다. 그러나 대화 형 텍스트 편집기 인터페이스는 없습니다. 오히려 텍스트를 통해 작동 할 때 따라야 할 지침을 제공합니다. 이것은 모두 Bash 및 기타 명령 줄 셸에서 작동합니다.

으로 sed당신은 다음의 모든 작업을 수행 할 수 있습니다 :

  • 텍스트 선택
  • 대체 텍스트
  • 텍스트에 줄 추가
  • 텍스트에서 줄 삭제
  • 원본 파일 수정 (또는 보존)

가장 간결하고 접근하기 어려운 sed명령 을 생성하지 않고 개념을 소개하고 설명하기 위해 예제를 구성했습니다 . 그러나의 패턴 일치 및 텍스트 선택 기능은 sed 정규식 (정규식)에 크게 의존합니다. .NET을 최대한 활용하려면 이들에 대해 어느 정도 익숙해야합니다 sed.

관련 : Linux에서 정규식 (정규식)을 사용하는 방법

간단한 예

먼저 파이프 echosed통해 일부 텍스트를 보내고 텍스트의 일부를 sed 대체하는 데 사용합니다. 이를 위해 다음을 입력합니다.

에코 howtogonk | sed 's / gonk / geek /'

echo명령은 "howtogonk"를로 전송 sed하고 간단한 대체 규칙 ( "s"는 대체를 나타냄)이 적용됩니다. sed 입력 텍스트에서 첫 번째 문자열이 있는지 검색하고 일치하는 항목을 두 번째 문자열로 바꿉니다.

문자열 "gonk"는 "geek"로 대체되고 새 문자열이 터미널 창에 인쇄됩니다.

대체는 아마도 sed. 그러나 대체 항목에 대해 더 자세히 알아 보려면 텍스트를 선택하고 일치시키는 방법을 알아야합니다.

텍스트 선택

예제를 위해 텍스트 파일이 필요합니다. 우리는 Samuel Taylor Coleridge의 서사시 "The Rime of the Ancient Mariner"의 일부 구절을 포함하는 하나를 사용할 것입니다.

살펴보기 위해 다음을 입력합니다 less.

덜 coleridge.txt

파일에서 일부 행을 선택하기 위해 선택하려는 범위의 시작 및 끝 행을 제공합니다. 하나의 숫자는 그 한 줄을 선택합니다.

1-4 줄을 추출하려면 다음 명령을 입력합니다.

sed -n '1,4p'coleridge.txt

1와 사이의 쉼표에 유의하십시오 4. p수단 "일치하는 라인을 인쇄 할 수 있습니다." 기본적으로  sed 모든 행을 인쇄합니다. 일치하는 줄이 두 번 인쇄 된 파일의 모든 텍스트를 볼 수 있습니다. 이를 방지하기 위해 -n(quiet) 옵션을 사용하여 일치하지 않는 텍스트를 억제합니다.

다음과 같이 다른 절을 선택할 수 있도록 줄 번호를 변경합니다.

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 하고 파일을 한 단계 씩 이동하고 다섯 번째 줄마다 다른 줄을 인쇄하거나 원하는 수의 줄을 건너 뛰 도록 지시 할 수도 있습니다 . 이 명령은 위에서 범위를 선택하는 데 사용한 것과 유사합니다. 그러나 이번에 ~는 쉼표 대신 물결표 ( )를 사용하여 숫자를 구분합니다.

첫 번째 숫자는 출발 선을 나타냅니다. 두 번째 숫자는 sed우리가보고자하는 출발 선 뒤의 어떤 줄을 알려줍니다 . 숫자 2는 모든 두 번째 줄을 의미하고 3은 모든 세 번째 줄을 의미하는 식입니다.

다음을 입력합니다.

sed -n '1 ~ 2p'coleridge.txt

찾고있는 텍스트가 파일에서 어디에 있는지 항상 알 수는 없습니다. 즉, 줄 번호가 항상 도움이되는 것은 아닙니다. 그러나을 사용 sed 하여 일치하는 텍스트 패턴이 포함 된 행을 선택할 수도 있습니다 . 예를 들어 "And"로 시작하는 모든 줄을 추출해 보겠습니다.

캐럿 ( ^)은 줄의 시작을 나타냅니다. 검색어를 슬래시 ( /)로 묶습니다 . 또한 "And"뒤에 공백을 포함하므로 "Android"와 같은 단어는 결과에 포함되지 않습니다.

sed처음에는 스크립트를 읽는 것이 약간 어려울 수 있습니다. /p 우리가 위에서 사용 된 명령에했던 것처럼 수단 "인쇄". 그러나 다음 명령에서는 슬래시가 앞에옵니다.

sed -n '/ ^ 그리고 / p'coleridge.txt

"And"로 시작하는 세 줄이 파일에서 추출되어 표시됩니다.

대체하기

첫 번째 예에서는 다음과 같은 sed대체 기본 형식을 보여주었습니다 .

에코 howtogonk | sed 's / gonk / geek /'

ssed 이 교체입니다. 첫 번째 문자열은 검색 패턴이고 두 번째 문자열은 일치하는 텍스트를 대체 할 텍스트입니다. 물론 모든 리눅스와 마찬가지로 악마는 세부 사항에 있습니다.

다음을 입력하여 "day"의 모든 발생을 "week"로 변경하고 선원과 알바트 로스가 결합 할 시간을 더 많이 제공합니다.

sed -n 's / day / week / p'coleridge.txt

첫 번째 줄에서 "day"의 두 번째 항목 만 변경됩니다. 이는 sed라인 당 첫 번째 일치 후에 중지 하기 때문 입니다. 아래에 표시된 것처럼 식 끝에 "g"를 추가하여 전역 검색을 수행하여 각 줄의 모든 일치 항목이 처리되도록해야합니다.

sed -n 's / day / week / gp'coleridge.txt

이것은 첫 번째 줄의 4 개 중 3 개와 일치합니다. 첫 번째 단어는 "Day"이고 sed대소 문자를 구분하기 때문에 해당 인스턴스가 "day"와 동일한 것으로 간주하지 않습니다.

다음을 입력하고 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

세미콜론 ( ;)을 사용 하여 두 표현식을 분리하면 다음과 같이 동일한 결과를 얻을 수 있습니다 .

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

이를 방지하기 위해 다른 패턴과 일치하는 줄에서만 대체를 시도 할 수 있습니다. 처음에 검색 패턴을 갖도록 명령을 수정하면 해당 패턴과 일치하는 행에서만 작동하는 것을 고려합니다.

일치 패턴을 "이후"라는 단어로 만들기 위해 다음을 입력합니다.

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아래와 같이를 사용  하여 파일 내용을 볼 수 있습니다.

고양이 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 내 손목 주위에 매달렸다'coleridge.txt

이제 새로운 라인이 추출 하단에 나타납니다.

라인 및 텍스트 삽입

파일에 새 줄과 텍스트를 삽입 할 수도 있습니다. 일치하는 줄 뒤에 새 줄을 삽입하려면 Append 명령 ( a)을 사용합니다 .

작업 할 파일은 다음과 같습니다.

고양이 geeks.txt

이 작업을 좀 더 쉽게 수행 할 수 있도록 줄에 번호를 매겼습니다.

다음을 입력하여 "He"라는 단어가 포함 된 줄을 검색하고 그 아래에 새 줄을 삽입합니다.

sed '/ He / a-> 삽입 됨!' geeks.txt

다음을 입력하고 삽입 명령 ( i)을 포함하여 일치하는 텍스트가 포함 된 행 위에 새 행을 삽입합니다.

sed '/ He / i-> 삽입 됨!' geeks.txt

&일치하는 줄에 새 텍스트를 추가하기 위해 원래 일치 텍스트를 나타내는 앰퍼샌드 ( )를 사용할 수 있습니다 . \1 ,  \2등은 일치하는 하위 표현식을 나타냅니다.

줄의 시작 부분에 텍스트를 추가하기 위해 새 텍스트를 원래 줄과 결합하는 대체 절과 결합 된 줄의 모든 항목과 일치하는 대체 명령을 사용합니다.

이 모든 작업을 수행하려면 다음을 입력합니다.

sed 's /.*/--> 삽입 됨 & /'geeks.txt

G각 줄 사이에 빈 줄을 추가하는 명령을 포함하여 다음을 입력합니다 .

sed 'G'geeks.txt

두 개 이상의 빈 줄을 추가하려면 G;GG;G;G등을 사용할 수 있습니다 .

라인 삭제

삭제 명령 ( d)은 검색 패턴과 일치하거나 줄 번호 또는 범위로 지정된 줄을 삭제합니다.

예를 들어 세 번째 줄을 삭제하려면 다음을 입력합니다.

sed '3d'geeks.txt

4 ~ 5 행의 범위를 삭제하려면 다음을 입력합니다.

sed '4,5d'geeks.txt

범위 밖의 줄을 삭제하려면 !아래와 같이 느낌표 ( )를 사용 합니다.

sed '6,7! d'geeks.txt

변경 사항 저장

지금까지 모든 결과가 터미널 창에 인쇄되었지만 아직 어디에도 저장하지 않았습니다. 이를 영구적으로 만들기 위해 원본 파일에 변경 사항을 쓰거나 새 파일로 리디렉션 할 수 있습니다.

원본 파일을 덮어 쓰려면 약간의주의가 필요합니다. sed명령이 잘못된 경우 실행 취소하기 어려운 원본 파일을 일부 변경할 수 있습니다.

안심할 sed 수 있도록 명령을 실행하기 전에 원본 파일의 백업을 만들 수 있습니다.

In-place 옵션 ( -i)을 사용 sed하여 원본 파일에 변경 사항을 쓰 도록  지시 할 수 있지만 파일 확장명을 추가 sed 하면 원본 파일이 새 파일로 백업됩니다. 원본 파일과 이름은 같지만 새 파일 확장자를가집니다.

설명을 위해 "He"라는 단어가 포함 된 모든 줄을 검색하고 삭제합니다. 또한 BAK 확장자를 사용하여 원본 파일을 새 파일로 백업합니다.

이 모든 작업을 수행하려면 다음을 입력합니다.

sed -i'.bak ''/^.*He.*$/d 'geeks.txt

백업 파일이 변경되지 않았는지 확인하기 위해 다음을 입력합니다.

고양이 geeks.txt.bak

또한 다음을 입력하여 출력을 새 파일로 리디렉션하고 비슷한 결과를 얻을 수 있습니다.

sed -i'.bak ''/^.*He.*$/d 'geeks.txt> new_geeks.txt

cat아래와 같이 변경 사항이 새 파일에 기록되었는지 확인하는 데 사용 합니다.

cat new_geeks.txt

모든 것을 sed

아시다시피이 간단한 입문서조차도 sed꽤 깁니다. 이 명령에는 많은 것이 있으며이 명령으로 수행 할 수있는 작업이 훨씬 더 많습니다.

하지만 이러한 기본 개념이 계속해서 더 많은 것을 배우면서 구축 할 수있는 견고한 토대를 제공했기를 바랍니다.