본문 바로가기

IT's Life/Linux

Linux sed command complete Raiders (상세 설명)


Vim은 대화식 텍스트 편집 모드를 사용하여 데이터에서 텍스트를 키보드 명령으로 대화식으로 삽입, 삭제 또는 바꿀 수 있습니다. 그러나이 섹션의 sed 명령은 다릅니다. 스트림 편집 모드를 사용합니다. 가장 확실한 기능은 sed가 데이터를 처리하기 전에 규칙 세트를 미리 제공해야하며 sed가이 규칙에 따라 데이터를 편집한다는 것입니다. 


Sed는 스크립트 명령에 따라 텍스트 파일의 데이터를 처리하며이 명령은 명령 줄에서 입력하거나 텍스트 파일에 저장합니다. 명령이 데이터를 실행하는 순서는 다음과 같습니다.

한 번에 한 줄만 읽으십시오.

제공된 규칙 명령에 따라 데이터를 일치시키고 수정하십시오. sed는 기본적으로 소스 파일 데이터를 직접 수정하지는 않지만 데이터를 버퍼에 복사하며 수정은 버퍼의 데이터로 제한됩니다.

결과 출력이 실행됩니다.

데이터 행이 일치하면 계속해서 다음 데이터 행을 읽고 파일의 모든 데이터가 처리 될 때까지 프로세스를 반복합니다. 


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

[root @ localhost ~] # sed [옵션] [스크립트 명령] 파일 이름

이 명령에 일반적으로 사용되는 옵션과 의미가 표에 나와 있습니다.

표 1 sed 명령의 공통 옵션 및 의미

옵션

의미 

-e 스크립트 명령 

이 옵션은 뒤에 나오는 스크립트 명령을 기존 명령에 추가합니다. 

 -f 스크립트 명령 파일

이 옵션은 후속 파일의 스크립트 명령을 기존 명령에 추가합니다. 

 -n

기본적으로 sed는 모든 스크립트가 지정된 후에 처리 된 내용을 자동으로 출력합니다이 옵션은 시작 출력을 마스킹하고 print 명령을 사용하여 출력을 완료합니다. 

 -i

이 옵션은 소스 파일을 직접 수정하므로주의해서 사용해야합니다. 

sed 명령을 성공적으로 사용하려면 파일 편집 규칙을 사용자 정의하는 데 도움이되는 다양한 스크립트 명령 및 형식을 마스터해야합니다.


sed 스크립트 명령

ss replace script 명령

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

[주소] s / 패턴 / 교체 / 플래그

address가 조작 할 특정 행을 지정하는 경우 pattern은 교체해야하는 컨텐츠를 나타내며 replace는 교체 할 새 컨텐츠를 나타냅니다.

지정된 특정 작업 라인 (주소)의 사용법에 대해서는 여기에서 설명하지 않으며 기사에서 자세히 설명합니다.

이 명령에서 일반적으로 사용되는 플래그 플래그는 표에 표시되어 있습니다.

표  sed s 명령 플래그 태그 및 기능

플래그 태그

기능 

 n

1에서 512 사이의 숫자로, 교체 할 문자열이 몇 번 교체됨을 나타냅니다 (예 : 행에 3 개가 있고 사용자가 두 번째 A 만 교체하려는 경우). ; 

 g

데이터에서 일치하는 모든 내용을 교체합니다. g가 없으면 첫 번째 일치가 성공했을 때만 교체됩니다. 예를 들어, 데이터 행에 3 개의 As가 있으면 첫 번째 A 만 바뀝니다. 

 p

교체 명령에 지정된 패턴과 일치하는 줄이 인쇄됩니다. 이 태그는 일반적으로 -n 옵션과 함께 사용됩니다.

정규식과 일치하는 내용으로 바꾸십시오. 

 \ n

이전에 \ (\)와 패턴으로 지정된 n 번째 부분 문자열과 일치합니다. 

 \

이스케이프 교체 부품에는 &, \ 등이 포함됩니다. 

 w 파일

 버퍼의 내용을 지정된 파일 파일에 씁니다. 

예를 들어, 첫 번째 패턴 일치를 새 텍스트로 바꾸려면 sed를 지정할 수 있습니다.

[root @ localhost ~] # sed 's / test / trial / 2'data4.txt 

이것은 시험 스크립트의 테스트이며 시험 스크립트 

의 두 번째 테스트입니다.

보시다시피, 숫자 2를 토큰으로 사용하면 sed 편집기가 각 행에서 일치하는 패턴의 두 번째 항목 만 대체합니다. 

일치하는 모든 문자열을 새 파일로 바꾸려면 g 태그를 사용할 수 있습니다.

[root @ localhost ~] # sed 's / test / trial / g'data4.txt 

평가판 스크립트 평가판이며 평가판 스크립트 

의 두 번째 평가판입니다.


-n 옵션은 sed 출력을 비활성화하지만 p 플래그는 수정 된 행을 출력한다는 것을 알고 있습니다. 두 플래그를 일치 시키면 다음과 같이 replacement 명령으로 수정 된 행만 출력합니다.

[root @ localhost ~] # cat data5.txt 

이것은 테스트 줄입니다 

다른 줄입니다 

[root @ localhost ~] # sed -n 's / test / trial / p'data5.txt 

이것은 시험 줄입니다. .

w 표시는 일치하는 결과를 지정된 파일에 저장합니다 (예 :

[root @ localhost ~] # sed 's / test / trial / w test.txt'data5.txt 

이것은 시험 라인입니다. 

이것은 다른 라인입니다 

[root @ localhost ~] #cat test.txt 

이것은 시험입니다. 선.

s script 명령을 사용하는 경우 파일 경로와 같은 문자열을 바꾸는 것이 번거롭고 경로에서 슬래시를 이스케이프해야합니다. 예를 들면 다음과 같습니다.

[root @ localhost ~] # sed 's / \ / bin \ / bash / \ / bin \ / csh /'/ etc / passwd


SED D 교체 스크립트 명령

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

[주소] d

텍스트에서 특정 행을 삭제해야하는 경우 d 스크립트 명령을 사용하면 지정된 행의 모든 ​​항목이 삭제됩니다. 그러나이 명령을 사용할 때는주의하십시오 : 특정 행을 지정하지 않으면 파일의 모든 내용이 삭제됩니다. 예를 들면 다음과 같습니다.

[root @ localhost ~] # cat data1.txt 

빠른 브라운 폭스 게으른 개 

위로 점프 

빠른 브라운 폭스 게으른 개 

위로 점프 빠른 브라운 폭스 게으른 개 위로 점프 빠른 브라운 폭스 게으른 개 위로 점프 

[root @ 로컬 호스트 ~] # sed 'd'data1.txt # 아무것도 

출력 되지 않습니다 . 빈 파일임이 증명되었습니다

지정된 주소와 함께 사용될 때 delete 명령은 분명히 큰 역할을합니다. 데이터 스트림에서 특정 텍스트 줄을 제거 할 수 있습니다. 


구체적인 주소 작성 방법은 나중에 자세히 설명합니다. 몇 가지 간단한 예는 다음과 같습니다.

data6.txt 파일의 내용에서 세 번째 줄 삭제와 같이 줄 번호로 지정하십시오.

[root @ localhost ~] # cat data6.txt 

이것은 행 번호 1입니다. 

이것은 행 번호 2입니다. 

이것은 행 번호 3입니다. 

이것은 행 번호 4입니다. 

[root @ localhost ~] # sed '3d'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다. 

이것은 줄 번호 4입니다.


또는 data6.txt 파일의 내용에서 행 2와 3을 삭제하는 등의 특정 행 간격으로 지정하십시오.

[root @ localhost ~] # sed '2,3d'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 4입니다.

두 가지 텍스트 모드를 사용하여 범위 내에서 행을 삭제할 수도 있지만이 작업을 수행 할 때는주의하십시오. 첫 번째로 지정한 모드는 행 삭제 기능을 "열고", 두 번째 모드는 행 삭제 기능을 "끄십시오". 따라서 sed는 지정된 두 행 (지정된 행 포함) 사이의 모든 행을 삭제합니다. 예를 들면 다음과 같습니다.

[root @ localhost ~] #sed '/ 1 /, / 3 / d'data6.txt 

# 1 ~ 3 행의 텍스트 데이터 삭제 

이것은 4 행입니다.


또는 data6.txt 파일의 내용에서 3 행부터 시작하는 모든 내용을 삭제하는 것과 같은 특수 파일 끝 문자를 통해 :

[root @ localhost ~] # sed '3, $ d'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다.

여기서 기본적으로 sed는 원본 파일을 수정하지 않으며, 여기서 삭제 된 줄은 sed의 출력에서 ​​사라지고 원본 파일은 변경되지 않았습니다.


sed a 및 i 스크립트 명령

a 명령은 행이 지정된 행에 추가됨을 나타내고, i 명령은 행이 지정된 행 앞에 삽입됨을 나타냅니다. 두 스크립트 명령은 기본 형식이 다음과 같이 동일하므로 동시에 도입됩니다.

[주소] a (또는 i) \ 새 텍스트 내용

다음은이 두 명령을 읽는 독자를위한 몇 가지 예입니다. 예를 들어, 데이터 스트림의 세 번째 줄 앞에 새 줄을 삽입하려면 다음과 같이 명령을 실행하십시오.

[루트 @ localhost를가 ~] # Sed의 '3I는 \ 

>이 선을 삽입하는.'data6.txt 

이 1 줄 번호입니다 

이것은 라인 번호 2 IS 

이이 라인을 삽입한다. 

이 라인 번호 3. IS 

이 라인 번호입니다 4.


다른 예를 들어, 데이터 스트림의 세 번째 행에 새 행을 첨부 한 후 다음과 같이 명령을 실행하십시오.

[root @ localhost ~] # sed '3a \ 

> 이것은 추가 된 줄입니다.'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다. 

이것은 줄 번호 3 

입니다. 

이것은 줄 추가입니다. 4.


데이터 스트림에 여러 줄 데이터를 추가하려면 삽입하거나 추가하려는 텍스트 (마지막 줄 제외)의 각 줄 끝에 백 슬래시를 추가하십시오.

[root @ localhost ~] # sed '1i \ 

> 새 줄의 한 줄입니다. \ 

> 새 줄의 다른 줄입니다.'data6.txt 

새 줄의 한 줄입니다 

이것은 라인 번호 1입니다. 

이것은 라인 번호 2입니다. 

이것은 라인 번호 3입니다. 

이것은 라인 번호 4입니다.

보시다시피, 지정된 두 줄이 데이터 스트림에 추가됩니다.


sed c replace 스크립트 명령

c 명령은 지정된 행의 모든 ​​것을 옵션 다음에 나오는 문자열로 바꾸는 것을 의미합니다. 명령의 기본 형식은 다음과 같습니다.

[주소] c \ 새 텍스트 교체

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

[root @ localhost ~] # sed '3c \ 

> 이것은 변경된 텍스트 줄입니다.'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2 

입니다. 

이것은 줄 바꿈 된 줄입니다. 

이 예에서 sed 편집기는 세 번째 줄의 텍스트를 수정하지만 실제로 다음을 수행 할 수도 있습니다. 

[root @ localhost ~] # sed '/ number 3 / c \ 

> 이것은 Text. 'data6.txt 

이것은 행 번호 1입니다. 

이것은 행 번호 2 

입니다. 

이것은 변경된 텍스트 행입니다. 이것은 행 번호 4입니다.


sed y 변환 스크립트 명령

y 변환 명령은 단일 문자를 처리 할 수있는 유일한 sed 스크립트 명령이며 기본 형식은 다음과 같습니다.

[주소] y / inchars / outchars /

변환 명령은 inchars 및 outchars 값을 일대일로 맵핑합니다. 즉, inchars의 첫 번째 문자는 outchars의 첫 번째 문자로 변환되고 두 번째 문자는 outchars의 두 번째 문자로 변환됩니다. ...이 맵핑 프로세스는 지정된 문자가 처리 될 때까지 계속됩니다. inchars와 outchars의 길이가 다른 경우 sed는 오류 메시지를 생성합니다. 

간단한 예를 들면 다음과 같습니다.

[root @ localhost ~] # sed 'y / 123 / 789 /'data8.txt 

이것은 줄 번호 7입니다. 

이것은 줄 번호 8입니다. 

이것은 줄 번호 9입니다. 

이것은 줄 번호 4입니다. 

이것은 다시 줄 번호 7입니다. 

이것은 또 다른 라인 

이며 파일의 마지막 라인입니다.

보시다시피, inchars 패턴에서 지정된 문자의 각 인스턴스는 outchars 모드에서 동일한 문자로 바뀝니다. 


변환 명령은 전역 명령입니다. 즉, 표시되는 위치에 관계없이 텍스트 행에있는 지정된 모든 문자를 자동으로 변환 한 다음 유추합니다.

[root @ localhost ~] # echo "이 1 번은 1 번의 시험입니다."| sed 'y / 123 / 456 /' 

이 4 번은 4 번의 시험입니다.

Sed는 텍스트 줄에서 일치하는 문자 1의 두 인스턴스를 변환하므로 특정 위치에만 나타나는 문자를 제한 할 수 없습니다.


SED P 인쇄 스크립트 명령

p 명령은 검색 기호 조건의 행을 나타내고 행의 내용을 출력합니다.이 명령의 기본 형식은 다음과 같습니다.

[주소] p

p 명령의 일반적인 사용은 다음과 같이 일치하는 텍스트 패턴이 포함 된 행을 인쇄하는 것입니다.

[root @ localhost ~] # cat data6.txt 

이것은 행 번호 1입니다. 

이것은 행 번호 2입니다. 

이것은 행 번호 3입니다. 

이것은 행 번호 4입니다. 

[root @ localhost ~] # sed -n '/ number 3 / p 'data6.txt 

이것은 라인 번호 3입니다.

보시다시피, p 명령과 함께 -n 옵션을 사용하면 다른 줄의 출력을 억제하고 일치하는 텍스트 패턴을 포함하는 줄만 인쇄 할 수 있습니다. 

교체 또는 수정 명령과 같이 수정하기 전에 행을보아야하는 경우 인쇄 명령을 사용할 수도 있습니다. 다음과 같이 줄을 수정하기 전에 줄을 표시하는 스크립트를 만들 수 있습니다.

[root @ localhost ~] # sed -n '/ 3 / { 

> p 

> s / line / test / p 

>}'data6.txt 

이것은 행 

번호 3입니다. 이것은 테스트 번호 3입니다.

sed 명령은 숫자 3을 포함하는 행을 찾은 다음 두 명령을 실행합니다. 먼저 스크립트는 p 명령으로 원래 줄을 인쇄 한 다음 텍스트를 s 명령으로 바꾸고 교체 결과를 p 플래그로 인쇄합니다. 출력에는 원래 줄 텍스트와 줄 바꾸기 텍스트가 모두 표시됩니다.


sed w 스크립트 명령

w 명령은 텍스트에 지정된 행의 내용을 파일에 쓰는 데 사용되며이 명령의 기본 형식은 다음과 같습니다.

[주소] w 파일 이름

여기서 filename은 파일 이름을 나타내며 상대 경로 또는 절대 경로를 사용할 수 있지만 두 경우 모두 sed 명령을 실행하는 사용자는 파일에 대한 쓰기 권한이 있어야합니다. 

다음 예제는 데이터 스트림의 처음 두 줄을 텍스트 파일로 인쇄합니다.

[root @ localhost ~] # sed '1,2w test.txt'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다. 

이것은 줄 번호 3 

입니다 

. Cat test.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다.


물론 라인을 직접 출력하지 않으려면 다른 예를 들어 -n 옵션을 사용할 수 있습니다.

[root @ localhost ~] # cat data11.txt 

Blum, R Browncoat 

McGuiness, A Alliance 

Bresnahan, C Browncoat 

Harken, C Alliance 

[root @ localhost ~] # sed -n '/ Browncoat / w Browncoats.txt'data11.txt 

cat Browncoats.txt 

Blum, R 브라운 코트 

Bresnahan, C 브라운 코트

보다시피, sed는 w script 명령을 사용하여 텍스트 패턴을 포함하는 데이터 라인을 대상 파일에 쓰는 데 사용될 수 있습니다.


SED R 스크립트 명령

r 명령은 별도의 파일의 데이터를 현재 데이터 스트림의 지정된 위치에 삽입하는 데 사용되며 명령의 기본 형식은 다음과 같습니다.

[주소] r 파일 이름

sed 명령은 지정된 주소 행 뒤에 파일 이름 파일의 내용을 삽입합니다 (예 :

[루트 @ localhost를가 ~] data12.txt # 고양이 

이이 라인에 추가됩니다. 

이 두 번째 라인이 추가된다. 

[루트 @ 로컬 호스트는 ~] data6.txt # Sed의 '3R의 data12.txt' 

이 1 라인 번호는 

이 라인 번호 2. 

이것은 라인 번호 3 

입니다. 

이것은 추가 된 라인 이며 두 번째로 추가 된 라인입니다 

.

지정된 파일의 데이터를 스트림의 끝에 삽입하려면 $ 주소 문자를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

[root @ localhost ~] # sed '$ r data12.txt'data6.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다. 

이것은 줄 번호 3입니다. 

이것은 줄 번호 4 

입니다. 

이것은 추가 된 줄입니다. 두 번째 줄 추가.


sed q exit 스크립트 명령

q 명령의 목적은 첫 번째 일치 태스크가 종료 된 후 sed 명령이 sed 프로그램을 종료하고 더 이상 후속 데이터를 처리하지 않도록하는 것입니다. 

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

[root @ localhost ~] # sed '2q'test.txt 

이것은 줄 번호 1입니다. 

이것은 줄 번호 2입니다.

sed 명령은 다음과 같이 q 명령으로 인한 출력물의 두 번째 행 이후에 중지됨을 알 수 있습니다.

[root @ localhost ~] # sed '/ number 1 / {s / number 1 / number 0 /; q;}'test.txt 

이것은 줄 번호 0입니다.

q 명령을 사용한 후 sed 명령은 숫자 1과 일치하면 숫자 0으로 바꾸고 직접 종료합니다.


sed 스크립트 명령 주소 지정 모드

우리는 다양한 스크립트 명령을 소개 할 때 주소 섹션에 대한 소개를 무시했습니다. 각 스크립트 명령에 대해 address는 스크립트 명령이 텍스트의 특정 행에서 작동 함을 나타내는 데 사용됩니다. 

기본적으로 sed 명령은 모든 행의 텍스트 데이터에서 작동합니다. 특정 행 또는 일부 행에만 명령을 적용하려면 다음 두 가지 방법이있는 주소 섹션을 지정해야합니다.

줄 간격을 숫자 형식으로 지정하십시오.

텍스트 모드에서 특정 줄 간격을 지정하십시오.


위의 두 가지 형식은 위의 두 가지 형식으로 사용할 수 있습니다.

[주소] 스크립트 명령 

또는 

주소 { 

    여러 스크립트 명령 

}

위의 두 형식은 이전 예제에서 특정 예제를 가지므로 여기서는 자세히 설명하지 않습니다.


숫자 형식으로 줄 간격 지정

디지털 행 주소 지정을 사용하는 경우 텍스트 스트림에서 행 위치를 참조 할 수 있습니다. Sed는 텍스트 스트림의 첫 번째 줄 번호를 1로 지정한 다음 줄 번호를 다음 줄에 순서대로 계속 지정합니다. 


스크립트 명령에서 지정된 주소는 단일 행 번호이거나 시작 행 번호, 쉼표 및 끝 행 번호로 지정된 특정 범위 내의 행일 수 있습니다. 다음은 지정된 줄 번호에서 작동하는 sed 명령의 예입니다.

[root @ localhost ~] #sed ' 2 s / dog / cat /'data1.txt 

빠른 브라운 폭스 게으른 개 

위로 점프 빠른 브라운 폭스 게으른 고양이 

위로 점프 빠른 브라운 폭스 게으른 개 위로 점프 

빠른 브라운 여우는 게으른 개 위로 점프


보시다시피 sed는 주소로 지정된 두 번째 줄의 텍스트 만 수정합니다. 다음 예제는 행 ​​주소 범위를 사용합니다.

[루트 @ localhost를 ~] # Sed의 ' 2,3 S / 개 / CAT /'DATA1.TXT 

빠른 브라운 개 폭스는 게으른을 통해 점프 

빠른 갈색 여우가 게으른 고양이 위로 이동 

게으른 고양이를 통해 점프 빠른 갈색 여우 

의 게으른 개 위로 빠른 갈색 여우 점프


이를 기반으로 줄에서 시작하는 텍스트의 모든 줄에 명령을 적용하려면 특수 주소-달러 기호 ($)를 사용할 수 있습니다.

[루트 @ localhost를 ~] # Sed의 ' 2 $ S / 개 / CAT /'DATA1.TXT 

다음은 게으른을 통해 빠른 브라운 개 폭스의 점프 

빠른 갈색 여우가 게으른 고양이를 통해 점프 

빠른 갈색 여우의 게으른 고양이를 통해 점프 

의 게으른 고양이 위로 빠른 갈색 여우 점프


텍스트 모드에서 줄 간격을 지정하십시오

Sed를 사용하면 텍스트 모드를 지정하여 명령이 수행 할 행을 다음 형식으로 필터링 할 수 있습니다.

/ pattern / command

지정할 패턴은 슬래시로 묶어야하며 sed는 지정된 텍스트 패턴을 포함하는 행에 명령을 적용합니다. 

예를 들어, 사용자 데모의 기본 쉘만 수정하려는 경우 sed 명령을 사용하고 다음과 같이 명령을 실행할 수 있습니다.

[root @ localhost ~] # grep demo / etc / passwd 

demo : x : 502 : 502 :: / home / Samantha : / bin / bash 

[root @ localhost ~] # sed '/ demo / s / bash / csh /' / etc / passwd 

root : x : 0 : 0 : root : / root : / bin / bash 

... 

demo : x : 502 : 502 :: / home / demo : / bin / csh 

...


고정 텍스트 모드를 사용하면 특정 값을 필터링하는 데 도움이 될 수 있지만 위의 사용자 이름 예제와 동일하지만 역할이 불가피하게 제한되므로 sed를 사용하면 텍스트 모드에서 정규 표현식을 사용하여 특정 조치 행을 표시 할 수 있습니다. 정규 표현식을 사용하면 다양한 데이터와 일치하는 고급 텍스트 패턴 일치 표현식을 작성할 수 있습니다. 이 표현식은 일련의 와일드 카드, 특수 문자 및 고정 텍스트 문자를 결합하여 거의 모든 형태의 텍스트와 일치하는 간결한 패턴을 생성합니다. 


정규 표현식의 경우이 섹션에서는 그다지 소개하지 않습니다 관심있는 독자는 " 정규 표현식 소개 "기사를 읽을 수 있습니다 . 독자를위한 간단한 예는 다음과 같습니다.

[root @ localhost ~] # cat test.txt 

<html> 

<title> First Wed </ title> 

<body> 

h1Helloh1 

h2Helloh2 

h3Helloh3 

</ body> 

</ html> # 

정규식을 사용하여 첫 번째 h1을 모두 H2, h3 추가 <>, 추가 </> 

[root @ localhost ~] # cat sed.sh 

/ h [0-9] / { 

    s // \ <& \> / 1


을 두 번째 h1, h2, h3에 추가     s // \ <\ / & \> / 2 }

[root @ localhost ~] # sed -f sed.sh test.txt 

<h1> Hello </ h1> 

<h2> Hello </ h2> 

<h3> Hello < / h3>


공간 제한을 수신 한이 섹션에서는 한 번에 한 줄씩 읽고 처리하는 sed 명령 만 소개합니다 한 번에 여러 줄의 텍스트 내용을 처리하는 방법은 다음 섹션에서 계속 설명하겠습니다 독자는 Linux sed 명령을 클릭하여 고급 사용법을 사용할 수 있습니다. 계속 배우십시오.