본문 바로가기

IT's Life/Linux

리눅스 sed 명령 고급 사용법


" 리눅스 sed 사용법 세부 사항 " 섹션 은 sed 명령의 기본 기능을 사용하여 텍스트의 데이터를 처리하는 방법을 보여줍니다. 이 섹션에서는 sed에서 제공하는 일부 고급 기능에 대해 설명하지만 이러한 기능은 일반적으로 사용되지 않지만 이러한 기능의 존재 및 사용법을 알아야합니다.


sed 여러 줄 명령

sed 명령의 기본 기능을 학습 할 때 모든 sed 명령이 단일 행 데이터에 대해서만 조작을 수행한다는 제한 사항이있을 수 있습니다 .sed 명령은 버퍼에서 텍스트 데이터를 읽을 때 개행 문자의 위치를 ​​기반으로합니다. 데이터를 행으로 나누고 sed는 정의 된 스크립트 명령을 기반으로 한 번에 한 행의 데이터를 처리합니다. 

그러나 때로는 여러 행의 데이터에 대해 특정 작업을 수행해야합니다. 예를 들어 text에서 문자열 문자열을 찾으면 "http://c.biancheng.net"각각이 일부를 포함하는 두 줄로 나타날 수 있습니다. 이때 텍스트가 일반 sed editor 명령으로 처리되면 그러한 분리를 찾을 수 없습니다. 


다행히도 sed 명령의 설계자는이를 고려하여 해당 솔루션을 설계했습니다. Sed에는 여러 줄의 텍스트를 처리하는 데 사용할 수있는 세 가지 특수 명령이 포함되어 있습니다.

다음 명령 (N) : 데이터 스트림에 다음 줄을 추가하여 처리 할 여러 줄 그룹을 만듭니다.

삭제 (D) : 여러 줄 그룹에서 행을 삭제합니다.

인쇄 (P) : 여러 줄 그룹으로 한 줄을 인쇄합니다.

위 명령의 약어는 모두 대문자입니다.


N 다중 라인 작동 명령

데이터 라인으로 명령을 나오지 버퍼에있는 텍스트의 두 전방 및 후방 라인이 두 라인으로 처리 될 수 있도록 N 명령 텍스트 버퍼의 다음 라인은, 기존 데이터 (사이 개행 문자 구분)에 첨가한다 후 . 

다음 예제는 N 명령의 기능을 보여줍니다.

[root @ localhost ~] # cat data2.txt 

이것은 헤더 행입니다. 

첫 번째 데이터 행입니다. 

두 번째 데이터 행입니다. 

이것은 마지막 행입니다. 

[root @ localhost ~] # sed '/ first / { N; s ​​/ \ n / /} 'data2.txt 

이것은 헤더 행 

으로, 첫 번째 데이터 라인으로, 두 번째 데이터 라인 

으로, 마지막 라인입니다.

이 예에서 sed 명령은 단어가 먼저 포함 된 텍스트 줄을 찾습니다. 행을 찾으면 N 명령을 사용하여 다음 행을 해당 행으로 병합하고 대체 명령 s를 사용하여 줄 바꿈을 공백으로 바꿉니다. 결과적으로 텍스트 파일의 두 줄은 sed의 출력에서 ​​한 줄이됩니다. 


데이터 파일에서 두 줄로 흩어져있는 텍스트 문구를 찾으려면 어떻게합니까? 다음은 모두를위한 예입니다.

[root @ localhost ~] # cat data3.txt 

화요일에 Linux 시스템 

관리자 그룹 회의가 열립니다. 

모든 시스템 관리자가 참석해야합니다. 참석 

감사합니다 

[root @ localhost ~] # sed 'N; s / System 관리자 / 데스크탑 사용자 / data3.txt 

화요일에 리눅스 데스크탑 사용자 그룹 회의가 열릴 것입니다 

모든 데스크탑 사용자가 참석해야합니다 참석해 

주셔서 감사합니다.


문구에 줄 바꿈이있는 경우에도 N 명령을함으로써 당신은, 와일드 카드 시스템과 관리자 사이의 명령을 대체하기 때문에, 당신은 아직도 그것을 찾을 수 있습니다 (.)로, 라인 및 합병 후 다음 줄의 첫 단어를 찾을 수 공백과 개행을 일치시킵니다. 그러나 개행과 일치하면 문자열에서 개행을 제거하여 두 줄이 한 줄로 병합됩니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 


이 문제를 해결하기 위해 sed 스크립트에서 두 개의 대체 명령을 사용할 수 있습니다. 하나는 여러 줄로 나타나는 문구를 일치시키고 다른 하나는 한 줄로 나타나는 문구를 일치시킵니다.

[루트 @ localhost를 ~] # Sed의 'N 

> S / 시스템 \ nAdministrator / 바탕 화면 \ nUSER 님 / 

> S / 시스템 관리자 / 데스크탑 사용자 / 

>'data3.txt 

온은 화요일에, 리눅스 데스크톱은 

사용자 그룹 회의 '는 개최됩니다. 

모든 데스크톱 참석 

해주셔서 감사합니다.


첫 번째 대체 명령은 특히 두 단어 사이의 줄 바꿈을 찾아서 대체 문자열에 배치합니다. 이를 통해 첫 번째 대체 명령은 두 용어 사이에서 개행을 찾아서이를 대체 문자열에 포함시킬 수 있습니다. 이를 통해 줄 바꿈 문자를 새 텍스트의 동일한 위치에 추가 할 수 있습니다. 

그러나 이 스크립트에는 여전히 작은 문제가 있습니다. 즉, sed 명령을 실행하기 전에 항상 다음 텍스트 행을 버퍼에 읽어들입니다. 다음 텍스트 행에 도달하면 읽을 다음 행이 없습니다. sed 프로그램이 중지되어 일치하는 텍스트가 마지막 행에 있으면 sed 명령이 일치하는 데이터를 찾지 못합니다. 


이 버그에 대한 해결책은 다음과 같이 N 명령 앞에 한 줄 명령을, N 명령 뒤에 여러 줄 명령을 넣는 것입니다.

[루트 @ localhost를 ~] # Sed의 ' 

> S / 시스템 \ nAdministrator / 바탕 화면 \ nUSER 님 / 

> N 

> S / 시스템 관리자 / 데스크탑 사용자 / 

>'data3.txt 

온 화요일에, 리눅스 데스크톱은 

사용자 그룹 회의 APOS에게됩니다 개최. 

모든 데스크톱 사용자가 참석해야합니다. 참석해 

주셔서 감사합니다.

이제 한 줄에서 문구를 찾기위한 대체 명령이 데이터 스트림의 다음 줄에서 제대로 작동하고 여러 줄 바꾸기 명령이 데이터 스트림의 중간에 나타나는 문구를 담당합니다.


D 여러 줄 삭제 명령

명령 (D)를 삭제 나오지 단지 하나의 열을 제공하는도, D가 제 명령 버퍼 개행 (를 포함하는 다열 행동, 즉 첫 번째 라인 버퍼를 삭제하는 명령 D를 삭제 제공 개행 전의 내용이 삭제됩니다. 

예를 들면 다음과 같습니다.

[root @ localhost ~] # cat data4.txt 

화요일에 Linux 시스템 

관리자 그룹 회의가 열리고 

모든 시스템 관리자가 참석해야합니다 

[root @ localhost ~] # sed 'N; / System \ nAdministrator / D'data4. Txt 

관리자 그룹 회의가 개최되며 

모든 시스템 관리자가 참석해야합니다.

문자의 두 번째 라인은 N 명령 버퍼에 추가되고, 제 일치하므로 SED 명령이 성공적으로 상기 첫 번째 명령은, 따라서, 데이터 삭제 D (즉, 첫 번째 행) 전에 버퍼를 바꿈 것 상기에 나타낸 결과가 얻어진다. 


다음 예제에서는 첫 번째 행 앞에 나타나는 데이터 스트림에서 빈 행을 삭제합니다.

[root @ localhost ~] # cat data5.txt 

이것은 헤더 행 

이며 데이터 행입니다 

마지막 행입니다 

[root @ localhost ~] # sed '/ ^ $ / {N; / header / D} 'data5.txt 

이것은 헤더 행입니다. 

이것은 데이터 행입니다. 

이것은 마지막 행입니다.

Sed는 빈 줄을 찾은 다음 N 명령을 사용하여 다음 줄의 텍스트를 버퍼에 추가합니다. 이 시점에서 버퍼의 내용에 단어 헤더가 포함되어 있으면 D 명령은 버퍼의 첫 번째 행을 삭제합니다.


P 여러 줄 인쇄 주문

P (대문자) 및 커맨드 라인 인쇄 명령 P (소문자)의 데이터 라인들에 대해 서로 다른 버퍼로서 D와 D 사이의 차이, 버퍼, 즉 오직 첫 번째 라인을 인쇄 첫 줄 바꿈 이전의 모든 것. 

예를 들어, test.txt 파일의 내용은 다음과 같습니다.

[root @ localhost ~] # cat test.txt 

aaa 

bbb 

ccc 

ddd 

eee 

fff


표 은 test.txt 파일의 내용에 대해 p 명령과 P 명령으로 생성 된 출력 정보를 비교합니다.

표 P 명령과 p 명령의 비교

P (대문자) 명령

 p (소문자) 명령

 [루트 @ localhost를 ~] # Sed의 '/.*/N;P' 

AAA 

AAA 

BBB 

CCC 

CCC 

DDD 

의 Eee 

의 Eee 

FFF

[루트 @ localhost를 ~] # Sed의 '/.*/N;p' 

AAA 

BBB 

AAA 

BBB의 

CCC 

DDD 

CCC 

DDD 

의 Eee 

FFF 

의 Eee 

FFF 

첫 번째 sed 명령은 N을 사용하여 다음 줄의 내용을 버퍼 내용의 뒷면에 추가합니다 (줄 바꿈). 즉, 버퍼의 내용이 처음으로 aaa \ nbbb이지만 P ( 대문자) 개행 문자를 인쇄하기 전의 명령 기능, 즉 aaa, 자동 출력 기능 출력 aaa 및 bbb에서 sed (sed 명령은 자동으로 \ n을 개행 문자로 출력 함) 등에서 출력이 표시됩니다. 결과. 


두 번째 sed 명령은 p (소문자) 단일 행 인쇄 명령을 사용하여 버퍼의 모든 내용을 인쇄합니다 (\ n은 자동으로 줄 바꿈으로 출력 됨).

공간을 유지하기 위해 sed

앞에서 언급했듯이 sed 명령은 버퍼의 내용을 처리하므로 실제로 버퍼를 패턴 공간 이라고합니다 . 패턴 공간이 sed 명령이 파일을 저장하는 유일한 공간은 아니라는 점을 언급 할 가치가 있습니다. Sed에는 일부 데이터를 임시로 저장하는 데 사용할 수있는 보류 공간 이라는 또 다른 버퍼 영역이 있습니다. 


표에는 홀드 공간을 조작하는 데 사용할 수있는 5 가지 명령이 나열되어 있습니다.

표 sed hold space 명령

사령부 

기능 

패턴 공간에서 보류 공간으로 컨텐츠 복사 

패턴 공간에서 보류 공간으로 컨텐츠 추가 

보류 공간에서 패턴 공간으로 컨텐츠 복사 

 G

보류 공간에서 패턴 공간으로 컨텐츠 추가 

 x

Exchange 스키마 공간 및 공간에 내용 보유 


일반적으로 h 또는 H 명령을 사용하여 문자열을 보류 공간으로 이동 한 후 저장된 문자열은 g, G 또는 x 명령을 사용하여 패턴 공간으로 다시 이동됩니다. 공간을 유지하는 가장 직접적인 효과는 패턴 공간에있는 모든 파일을 보관 공간에 복사 한 후 처리 할 다른 텍스트 내용을로드하기 위해 패턴 공간을 비울 수 있다는 것입니다. 

버퍼 영역이 두 개이므로 다음 예는 h 및 g 명령을 사용하여 sed 버퍼간에 데이터를 이동하는 방법을 보여줍니다.

[root @ localhost ~] # cat data2.txt 

이것은 헤더 행입니다. 

첫 번째 데이터 행입니다. 

두 번째 데이터 행입니다. 

이것은 마지막 행입니다. 

[root @ localhost ~] # sed -n '/ first / {h; p; n; p; g; p} 'data2.txt 

첫 번째 데이터 라인 

으로, 두 번째 데이터 라인 

으로, 첫 번째 데이터 라인입니다.

이 예제의 실행 프로세스는 다음과 같습니다.

  • sed 스크립트 명령은 정규식을 사용하여 단어가 포함 된 행을 먼저 필터링합니다.
  • 단어를 포함하는 행이 처음 나타나면 h 명령은 행을 보류 공간에 배치합니다.
  • p 명령 인쇄 모드 공간은 또한 제 1 데이터 라인의 내용이다;
  • n 명령은 데이터 스트림에서 다음 행을 추출하여 패턴 공간에 배치합니다.
  • p 명령은 패턴 공간의 내용을 인쇄합니다. 이제는 두 번째 데이터 라인입니다.
  • g 명령은 공백 (이것은 첫 번째 데이터 라인 임)의 내용을 패턴 공간에 다시 넣고 현재 텍스트를 대체합니다.
  • p 명령은 패턴 공간의 현재 내용을 인쇄하고 이제 첫 번째 데이터 라인으로 다시 변경됩니다.


Sed는 지정된 프로세스를 변경합니다

b 분기 명령

일반적으로 sed 프로그램의 실행은 첫 번째 스크립트 명령에서 시작하여 마지막 스크립트 명령까지 계속됩니다 (D 명령은 예외이며, sed는 새 행을 읽지 않고 스크립트의 맨 위로 복귀합니다). Sed는 명령 스크립트의 실행 흐름을 변경하기 위해 b-branch 명령 을 제공하며 결과는 구조화 된 프로그래밍과 유사합니다. 

b branch 명령의 기본 형식은 다음과 같습니다.

[주소] b [라벨]

이 중 address 매개 변수는 분기 명령을 트리거 할 데이터 행을 결정하고 label 매개 변수는 이동할 위치를 정의합니다. 

label 매개 변수를 추가하지 않으면 jump 명령이 스크립트 끝으로 이동합니다. 예를 들면 다음과 같습니다.

[root @ localhost ~] # cat data2.txt 

이것은 헤더 행입니다. 

첫 번째 데이터 행입니다. 

두 번째 데이터 행입니다. 

이것은 마지막 행입니다. 

[root @ localhost ~] # sed '{2,3b s / This is / is this /; s / line. / test? /} 'data2.txt 이것은 

헤더 테스트입니까? 

첫 번째 데이터 라인입니다. 

이것은 두 번째 데이터 라인입니다. 

이것이 마지막 테스트입니까?

보다시피, b 명령은 label 매개 변수를 지정하지 않기 때문에 데이터 스트림의 두 번째 및 세 번째 행은이 두 개의 대체 명령을 실행하지 않습니다. 


스크립트의 끝으로 직접 이동하지 않으려면 b 명령의 레이블 (즉, 최대 7 자 길이의 형식의 레이블)을 지정할 수 있습니다. 이 태그를 사용하는 경우 콜론 (예 : label2)으로 시작하여 스크립트 명령 다음에 건너 뛰십시오. 따라서 sed 명령이 텍스트 줄과 일치하고 처리되면 태그 앞의 모든 스크립트 명령은 건너 뛰지 만 태그 뒤의 스크립트 명령은 실행됩니다. 

예를 들면 다음과 같습니다.

[root @ localhost ~] # sed '{/ first / b jump1; s / 이것은 점프 없음 / 

> : jump1 

> s / 이것은 여기 / Jump here /}'data2.txt 

헤더 행에 점프 없음 

첫 번째 데이터 라인에서 점프하십시오 

두 번째 데이터 라인에서 

점프하지 않습니다 마지막 라인에서 점프하지 않습니다


이 예제에서 텍스트 행에 처음 나타나는 경우 프로그램 실행은 jump1 태그 다음에 스크립트 행으로 직접 이동합니다. 분기 명령의 패턴이 일치하지 않으면 sed는 모든 스크립트 명령을 계속 실행합니다. 

b 브랜치 명령은 다음과 같이 뒤로 점프 할뿐만 아니라 앞으로 점프 할 수 있습니다.

[root @ localhost ~] # echo "이것은 a, 테스트, 제거, 쉼표입니다."| sed -n '{ 

> : start 

> s /, // 1p 

> /, / b start 

>}' 

This A, 테스트,. 콤마 제거하고, IS 

,이 A, 시험이다 제거하는 쉼표. 

이 테스트입니다, 쉼표를 제거 하였다. 

이 쉼표 제거를 위해 테스트된다. 

이것에 테스트입니다 쉼표 제거 : 쉼표 

를 제거하는 테스트입니다.

이 예제에서 버퍼의 행 내용에 쉼표가 있으면 스크립트 명령이 계속 실행되고 각 반복시 텍스트의 첫 번째 쉼표가 삭제되고 내용에 쉼표가 없을 때까지 문자열이 인쇄됩니다.


t 테스트 명령

b branch 명령과 마찬가지로 t 명령을 사용하여 sed 스크립트의 실행 흐름을 변경할 수도 있습니다. t 테스트 명령은 s에 따라 명령 결과를 대체합니다. 일치에 성공하고 교체에 성공하면 스크립트 실행이 지정된 레이블로 이동하고 그렇지 않으면 t 명령이 유효하지 않습니다. 

테스트 명령은 분기 명령과 동일한 형식을 사용합니다.

[주소] t [라벨]

branch 명령과 마찬가지로 s 명령이 지정되지 않은 경우 s 명령이 성공적으로 교체되면 sed는 스크립트의 끝으로 이동합니다 (스크립트 명령을 실행하지 않는 것과 동일). 예를 들면 다음과 같습니다.

[root @ localhost ~] # sed '{ 

> s / first / matched / 

> t 

> s / This is / No match on 

/>}'data2.txt 

헤더 줄 과 일치하지 않습니다 일치 

하는 데이터 줄 

과 일치하지 않습니다 두 번째 데이터 라인 

마지막 라인과 일치하지 않습니다


성공적인 검색 및 대체하는 경우, 본 실시 예에서는, 제 대체 텍스트 검색 모드 명령은 먼저, 여분 명령 후의 명령을 이동, 다른 손으로, 최초로 일치가 성공적인 대체 명령이 실패한 경우, 상기 제 여분의 명령 실행됩니다. 

다른 예를 들면 다음과 같습니다.

[root @ localhost ~] # echo "이것은 a, 테스트, 제거, 쉼표입니다."| sed -n '{ 

> : start 

> s /, // 1p 

> t start 

>}' 

이것은, a 상기 시험은, 제거에, 쉼표. 

이것은이 상기 시험에, 제거는 쉼표. IS 

이것은 시험에, 제거는 쉼표. A는 

이 제거에 상기 시험이다은 쉼표. 

이것은 제거하기 위해 시험 A는 콤마 . 

이것은 시험에 대한 콤마 분리된다.