English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Linux sed 명령어는 스크립트를 사용하여 텍스트 파일을 처리합니다.
sed는 스크립트의 지시에 따라 텍스트 파일을 처리하고 편집할 수 있습니다.
sed는 주로 파일을 자동으로 편집하고, 파일에 대한 반복적인 작업을 간소화하고, 변환 프로그램을 작성하는 데 사용됩니다.
sed [-hnV][-e<script>][-f<script 파일>][텍스트 파일]
파라미터 설명:
-e<script> 또는--expression=<script> : 입력 텍스트 파일을 처리하는 옵션 중에 지정된 script를 사용합니다.
-f<script 파일> 또는--file=<script 파일> : 입력 텍스트 파일을 처리하는 옵션 중에 지정된 script 파일을 사용합니다.
-h 또는--help : 도움말을 표시합니다.
-n 또는--quiet 또는--silent : script 처리 후 결과만 표시합니다.
-V 또는--version : 버전 정보를 표시합니다.
작업 설명:
a : 추가, a의 뒤에는 문자열을 추가할 수 있으며, 이 문자열은 현재의 다음 행에 추가됩니다~;
c : 대체, c의 뒤에는 문자열을 추가할 수 있으며, 이 문자열은 n을 대체할 수 있습니다;1,n2 의 행!
d : 제거, 제거이므로 d 뒤에는 어떤 것도 추가하지 않습니다;
i : 삽입, i의 뒤에는 문자열을 추가할 수 있으며, 이 문자열은 현재의 다음 행에 삽입됩니다;
p : 출력, 즉 특정 데이터를 인쇄합니다. 일반적으로 p는 sed와 함께 사용됩니다. -n 함께 실행하십시오~
s : 대체, 대체 작업을 직접 수행할 수 있습니다! 일반적으로 s 작업은 정규 표현식과 함께 사용됩니다. 예를 들어 1,20s/old/new/g 바로 그렇습니다!
testfile 파일의 네 번째 행 후에 한 행을 추가하고, 결과를 표준 출력으로 출력하는 명령어를 명령 프롬프트에서 입력하십시오:
sed -e 4a\newLine 테스트 파일
먼저 testfile의 내용을 다음과 같이 확인하십시오:
$ cat testfile #testfile 파일의 내용을 확인 HELLO LINUX! Linux는 무료 Unix입니다-운영 체제를 입력하십시오. 이것은 linux 테스트 파일입니다! Linux test
sed 명령어 사용 후, 다음과 같은 출력 결과가 나타납니다:
$ sed -e 4a\newline 테스트 파일 #sed를 사용하여 네 번째 행 후에 새 문자열을 추가 HELLO LINUX! #testfile 파일의 원래 내용 Linux는 무료 Unix입니다-운영 체제를 입력하십시오. 이것은 linux 테스트 파일입니다! Linux test newline
추가 /etc/passwd의 내용을 나열하고 행 번호를 출력하며, 동시에 다음과 같이 출력하십시오: 2~5 줄을 삭제합니다!
[root@www ~]# nl /etc/passwd | sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(이하 생략).....
sed의 작업은 '"2,5d'은 삭제라는 의미입니다! 왜냐하면 2-5 d'이 없기 때문에, 표시된 데이터는 없습니다 2-5 줄을 삭제했습니다. 따라서 표시된 데이터는 없습니다 -e만 맞습니다, 없습니다 -e도 됩니다! 또한 주의해야 할 것은, sed 뒤에 따르는 작업을 '' 두 개의 단락 기호로 감싸야 합니다!
만 삭제하면 됩니다 2 줄
nl /etc/passwd | sed '2d'
을 삭제합니다 3 마지막 줄까지
nl /etc/passwd | sed '3$d'
두 번째 줄 뒤(즉, 세 번째 줄에 추가)에『drink tea?』라는 텍스트를 추가합니다!
[root@www ~]# nl /etc/passwd | sed '2a drink tea' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(이하 생략).....
그런 경우 두 번째 줄 앞에
nl /etc/passwd | sed '2i drink tea'
두 줄 이상 추가하려면, 두 번째 줄 뒤에 두 줄을 추가합니다. 예를 들어 Drink tea or ...... 과 drink beer?
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\ > drink beer ?' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin Drink tea or ...... drink beer ? 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(이하 생략).....
각 줄 사이에는 반대호침『 \ 』로 새 줄을 추가해야 합니다. 따라서, 위의 예제에서는 첫 번째 줄의 마지막에 \이 있습니다.
을 대체합니다2-5줄의 내용을『No』로 대체됩니다 2-5 number』이에요?
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number' 1 root:x:0:0:root:/root:/bin/bash No 2-5 number 6 sync:x:5:0:sync:/sbin:/bin/sync .....(이하 생략).....
이 방법을 통해 데이터를 전체 줄로 대체할 수 있습니다!
제한적으로 나열 /etc/passwd 파일 내의 5-7 줄
[root@www ~]# nl /etc/passwd | sed -n '5,7p' 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
이 sed의 행 단위 표시 기능을 통해, 특정 파일 내의 일부 행 번호를 선택하여 표시할 수 있습니다.
검색 /etc/passwd에 root 키워드가 있는 줄
nl /etc/passwd | sed '/root/p' 1 root:x:0:0:root:/root:/bin/bash 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh 4 sys:x:3:3:sys:/dev:/bin/sh 5 sync:x:4:65534:sync:/bin:/bin/sync .... 무시
root가 찾으면, 모든 줄을 출력 외에도 일치하는 줄도 출력합니다.
사용-n이면 템플릿을 포함한 줄만 출력됩니다.
nl /etc/passwd | sed -n '/root/p' 1 root:x:0:0:root:/root:/bin/bash
삭제/etc/passwd에 포함된 root 모든 줄, 다른 줄은 출력
nl /etc/passwd | sed '/root/d' 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh .... 무시 # 첫 번째 줄의 매치 root가 삭제되었습니다
검색/etc/passwd에서 root에 해당하는 행을 찾아, 괄호 내의 명령을 실행합니다. 명령 간에는 분号으로 구분합니다. 여기서 bash을 blueshell로 변경하고, 이 줄을 출력합니다:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q' 1 root:x:0:0:root:/root:/bin/blueshell
마지막 q는 종료
전체 행 처리 모드 외에도, sed는 행 단위로 일부 데이터를 탐색하고 대체할 수 있습니다. 기본적으로 sed의 탐색 및 대체는 vi와 매우 유사합니다! 그것은 다음과 같습니다:
sed 's/대체될 문자열/새로운 문자열/g'
원본 정보를 관찰하면, /sbin/ifconfig로 IP를 확인
[root@www ~]# /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(이하 생략).....
이 기계의 IP는192.168.1.100。
IP 앞의 부분을 제거합니다
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
그 다음은 이후의 부분을 제거하는 것이며, 즉: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
IP 뒤의 부분을 제거합니다
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100
sed 명령어로 삭제/etc/passwd의 세 번째 줄부터 끝까지의 데이터를 검색하고, bash을 blueshell로 변경
nl /etc/passwd | sed -e '3$d' -e 's/bash/blueshell/' 1 root:x:0:0:root:/root:/bin/blueshell 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e는 여러곳에서 편집을 의미하며, 첫 번째 편집 명령은 삭제/etc/passwd의 세 번째 줄부터 끝까지의 데이터를 검색하고, 두 번째 명령을 bash 대신 blueshell로 변경합니다.
sed는 파일의 내용을 직접 수정할 수 있으며, 파이프 명령이나 데이터 스트림 재지향 명령을 사용하지 않아도 됩니다! 그러나 이 작업이 원본 파일을 직접 수정하기 때문에, 시스템 설정을 임의로 테스트하지 마세요! 정말로 파일 regular_express.txt를 사용하여 테스트해 보세요!
regular_express.txt 파일 내용如下:
[root@www ~]# cat regular_express.txt w3codebox. google. taobao. facebook. zhihu- weibo-
sed를 사용하여 regular_express.txt 내 각 행의 마지막 문자가 .이면 !로 변경
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt [root@www ~]# cat regular_express.txt w3codebox! google! taobao! facebook! zhihu- weibo-
:q:q
regular_express.txt 마지막 행에 직접 sed를 사용하여 추가 # This is a test:
[root@www ~]# sed -i '$a # This is a test' regular_express.txt [root@www ~]# cat regular_express.txt w3codebox! google! taobao! facebook! zhihu- weibo- # This is a test
由于 $는 마지막 행을 의미하며, a의 작업은 추가하는 것이므로, 파일 마지막에 추가됩니다 # This is a test!
sed의 -i 옵션을 사용하여 파일 내용을 직접 수정할 수 있습니다. 이 기능은 매우 유용합니다! 예를 들어, 당신이 100 만 행의 파일, 당신은 100 행에 일부 문자를 추가하면, 이 때 vim을 사용하면 발작할 수 있습니다! 파일이 너무 크기 때문입니다! 그럼 어떻게 합니까? sed를 사용하여 직접 수정하세요!/대체 기능, vim을 사용하지 않아도 됩니다!