링크 ux 기본 명령 소개 10: 텍스트 흐름 편집 sed

11914 단어 sedlinuxbashshell
vim 와 달리 sed 는 비 상호작용 적 인 텍스트 편집기 이 며, 동시에 문자 흐름 을 대상 으로 하 며, 줄 마다 데이터 sed 를 처리 한 후 출력 합 니 다.
sed [OPTION]... [script] [file]...
sed 의 작업 과정 은 다음 과 같다. 우선, 두 개의 데이터 버퍼 를 초기 화한 다.sed 한 줄 의 입력 (표준 입력 이나 파일 에서 온 것) 을 읽 고 끝 에 있 는 줄 바 꿈 문자 () 를 제거 한 다음 에 모델 공간 에 있 는 문자열 에 대해 'sed 명령' 을 실행 하기 시작 합 니 다. 모든 명령 은 와 관련 이 있 고 주 소 는 조건 으로 볼 수 있 으 며 조건 이 성립 될 때 만 관련 명령 이 실 행 됩 니 다.모든 실행 가능 한 명령 이 처 리 된 후에 도 패턴 공간 에 있 는 문자열 은 줄 바 꿈 자 를 추가 해서 출력 합 니 다.이후 다음 줄 의 입력 을 읽 고 같은 처 리 를 합 니 다. 주동 적 으로 종료 하거나 입력 이 끝 날 때 까지.
주소. 다음 과 같은 형식 일 수 있다.
1. number 줄 번호 2, first~step 는 first (숫자) 줄 에서 시작 하여 step (숫자) 줄 마다 3, $ 마지막 줄 을 표시 합 니 다.% 다른 단일 문자 로 바 꿀 수 있 습 니 다.(regexp 에 사선/을 포함 하 는 경우) 6, /regexp/ 정규 표현 식 regexp 와 일치 할 때 대소 문자 7 을 구분 하지 않 고 /regexp/I 정규 다 중 줄 모드 를 사용 하여 $가 줄 끝 뿐만 아니 라\r 이전 위치 도 일치 하도록 합 니 다.^ 줄 의 첫 번 째 뿐만 아니 라\r 뒤의 위치 도 일치 합 니 다.이 때 모드 공간의 시작 위 치 를 (\) 일치 시 키 고 (\) 일치 하 는 모드 공간의 끝 위 치 를 사용 할 수 있 습 니 다.
쉼표 /regexp/M 로 두 주 소 를 나 누 어 한 범 위 를 표시 할 수도 있다.
두 번 째 주소 나 파일 이 끝 날 때 까지 첫 번 째 주소 와 일치 하 는 것 을 표시 합 니 다.두 번 째 주소 가 정규 표현 식 이 라면 첫 번 째 주소 매 칭 줄 에 두 번 째 주소 매 칭 을 하지 않 습 니 다.두 번 째 주소 가 줄 번호 이지 만 첫 번 째 주소 가 줄 번호 와 일치 하거나 같 으 면 한 줄 만 일치 합 니 다 (첫 번 째 주소 가 줄 과 일치 합 니 다).
8. , 이 경우 정규 표현 식 regexp 는 첫 줄 에서 일치 합 니 다.두 번 째 주소 가 정규 표현 식 일 때 만 첫 번 째 주 소 는 0 을 사용 할 수 있 습 니 다.9. 0,/regexp/ 주소 addr 1 과 그 후의 n 줄 을 표시 합 니 다.10. addr1,+n 는 일치 하 는 주소 addr 1 부터 n 의 배수 줄 까지 표시 합 니 다.주 소 를 주지 않 으 면 모든 줄 이 일치 합 니 다.주소 나 주소 범위 에 추가 문자 addr1,~n 는 주소 에 대한 반 대 를 표시 하고 일치 하지 않 는 모든 줄 이 처 리 됩 니 다.
옵션! 기본적으로 줄 마다 처 리 된 문자열 이 출력 됩 니 다. 이 옵션 은 기본 동작 을 닫 는 것 을 표시 합 니 다.명령 -n 역할 을 하 는 문자열 만 출력 됩 니 다.p 는 file 에서 sed 명령 을 읽 는 것 -f file 은 제자리 에서 수정 하 는 것 을 나타 낸다.이 옵션 을 사용 하면 -i 임시 파일 을 만 들 고 처리 결 과 를 이 파일 로 출력 합 니 다. 처리 가 완료 되면 이 임시 파일 을 원본 파일 로 덮어 씁 니 다.sed 확장 정규 표현 식 사용
명령 하 다.-r 인쇄 모드 공간 내용 을 표시 하고 보통 옵션 p 과 함께 사용 합 니 다.
[root@centos7 ~]# seq 5
1
2
3
4
5
[root@centos7 ~]#           
[root@centos7 ~]# seq 5|sed -n '2,4p'
2
3
4
[root@centos7 ~]# 
-n 모드 공간 내용 을 삭제 하고 다음 줄 의 입력 을 즉시 처리 합 니 다.
#      
[root@centos7 ~]# seq 5|sed '$d'
1
2
3
4
[root@centos7 ~]#
d 즉시 종료 하고 명령 과 입력 을 처리 하지 않 습 니 다 (단일 주소 만 받 습 니 다)
[root@centos7 ~]# seq 5|sed '/3/q'
1
2
3
[root@centos7 ~]#
q 옵션 n 을 사용 하지 않 으 면 출력 모드 공간 에 있 는 내용 을 읽 은 후 다음 줄 의 입력 을 읽 고 현재 모드 공간 내용 을 덮어 씁 니 다.더 많은 입력 줄 이 없 으 면 sed 는 실행 을 종료 합 니 다.
[root@centos7 ~]# seq 9|sed -n 'n;p'
2
4
6
8
[root@centos7 ~]#            
-n replacement 으로 패턴 공간 에 정규 표현 식 regexp 와 일치 하 는 부분 을 표시 합 니 다.여기 서 기호 s/regexp/replacement/flag 는 임의의 단일 문자 로 바 꿀 수 있다.
[root@centos7 ~]# echo "hello123world"|sed 's/[0-9]\+/,/'  
hello,world
#    +    ,      -r     

replacement 에서
1. (n 은 1 - 9 의 숫자) 정규 표현 식 의 그룹 / 에 대한 인용 을 나타 낸다.
[root@centos7 ~]# echo "hello123world"|sed -r 's/[a-z]+([0-9]+)[a-z]+/\1/'
123
[root@centos7 ~]# echo "hello123world"|sed -r 's/([a-z]+)[0-9]+([a-z]+)/\1,\2/'
hello,world

2. (...) 모드 공간 에서 regexp 와 일치 하 는 모든 부분 을 나타 낸다.
[root@centos7 ~]# echo "hello123world"|sed -r 's/[0-9]+/:&:/'
hello:123:world

3.\L 은 뒤에 있 는 문 자 를 소문 자로 바 꾸 어\U 또는\E 가 나타 날 때 까지 합 니 다.4.\l 다음 문 자 를 소문 자로 바 꿉 니 다.5.\U 는 뒤의 문 자 를 대문자 로 바 꾸 어\L 또는\E 가 나타 날 때 까지 합 니 다.6.\u 는 다음 문 자 를 대문자 로 바 꿉 니 다.7.\\E 는\L 또는\U 에서 시작 하 는 대소 문자 전환 을 중단 합 니 다.
[root@centos7 ~]# echo "hello123world"|sed -r 's/^([a-z]+)[0-9]+([a-z]+)$/\U\1\E,\u\2/'
HELLO,World
[root@centos7 ~]# 

flag
1. & 숫자 n 은 n 번 째 일치 항목 을 교체 하 는 것 을 나타 낸다.
[root@centos7 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
#             
[root@centos7 ~]# head -1 /etc/passwd|sed 's/[^:]\+://5'
root:x:0:0:/root:/bin/bash

2. n 전체 국면 교 체 를 나타 낸다.
[root@centos7 ~]# echo "hello123world"|sed 's/./\U&\E/'
Hello123world
[root@centos7 ~]# 
[root@centos7 ~]# echo "hello123world"|sed 's/./\U&\E/g'
HELLO123WORLD
[root@centos7 ~]#
#   n g     ,    n                
[root@centos7 ~]# head -1 /etc/passwd|sed 's/[^:]\+://4g'
root:x:0:/bin/bash/

3. g 교체 에 성공 하면 인쇄 모드 공간 내용 을 표시 합 니 다.4. p 교체 에 성공 하면 출력 모드 공간 내용 을 파일 file 에 표시 합 니 다.5. w fileI 는 regexp 와 일치 할 때 대소 문 자 를 구분 하지 않 습 니 다.
[root@centos7 ~]# echo 'HELLO123world'|sed -r 's/[a-z]+//Ig'
123
[root@centos7 ~]#

6. iM 는 정규 다 중 줄 모드 를 사용 하 는 것 을 나타 낸다 (앞에서 말 한 바 와 같다).(명령 을 말 할 때 m 예 를 들 어)N source - chars 의 문 자 를 dest - chars 에 대응 하 는 위치 문자 로 바 꿀 수 있 습 니 다. y/source-chars/dest-chars/ 다른 임의의 단일 문자 로 바 꿀 수 있 습 니 다. source - chars 와 dest - chars 의 문자 수 는 일치 해 야 하 며 정규 표현 식 을 사용 할 수 없습니다.
[root@centos7 ~]# echo hello|sed 'y/el/LE/'      
hLEEo
[root@centos7 ~]#
/ 출력 모드 공간 내용 표시 후 텍스트 내용 추가 출력
[root@centos7 ~]# seq 3|sed '1,2a hello' 
1
hello
2
hello
3
[root@centos7 ~]#
a text 출력 모드 공간 내용 을 표시 하기 전에 text 내용 을 출력 합 니 다.
[root@centos7 ~]# seq 3|sed '$ihello'
1
2
hello
3
[root@centos7 ~]# 
i text 일치 하 는 주소 나 주소 범위 의 패턴 공간 내용 을 삭제 하고 text 내용 을 출력 합 니 다.단일 주소 라면 일치 하 는 줄 마다 출력 하고 주소 범위 라면 한 번 만 출력 합 니 다.
[root@centos7 ~]# seq 5|sed '1,3chello'
hello
4
5
[root@centos7 ~]# seq 5|sed '/^[^3-4]/c hello' 
hello
hello
3
4
hello
c text 현재 입력 줄 번 호 를 인쇄 하 는 것 을 표시 합 니 다.
[root@centos7 ~]# seq 100|sed -n '$='
100
[root@centos7 ~]# seq 100|sed -n '/^10\|^20/='
10
20
100
[root@centos7 ~]#    |     
= file 의 내용 을 읽 고 현재 모드 공간 내용 을 출력 한 후에 출력 합 니 다.
[root@centos7 ~]# cat file 
hello world
[root@centos7 ~]# seq 3|sed '1,2r file'
1
hello world
2
hello world
3
[root@centos7 ~]# 
r file 출력 모드 공간 내용 을 file 에 표시 합 니 다.w file 한 줄 의 내용 을 모드 공간 으로 읽 은 다음 에 다음 줄 의 내용 을 모드 공간 (이때 모드 공간 에서 line1line 2 와 같은 내용 형) 에 추가 하고 다음 줄 이 존재 하지 않 으 면 N 종료 합 니 다.
[root@centos7 ~]# seq 10|sed -n 'N;s/
/ /p' 1 2 3 4 5 6 7 8 9 10 [root@centos7 ~]# #s m flag [root@centos7 ~]# seq 3|sed 'N;s/^2/xxx/' 1 2 3 [root@centos7 ~]# seq 3|sed 'N;s/^2/xxx/m' 1 xxx 3 [root@centos7 ~]# seq 3|sed 'N;s/1$/xxx/' 1 2 3 [root@centos7 ~]# seq 3|sed 'N;s/1$/xxx/M' xxx 2 3
sed 모드 공간 에 새 줄 (예 를 들 어 명령 D 이 생 긴 새 줄) 이 없 으 면 명령 N 과 같은 역할 을 한다.새 줄 이 포함 되면 첫 줄 의 내용 을 삭제 하고 모드 공간 에 남 은 내용 을 다시 시작 합 니 다.(주의: D 뒤의 명령 은 무 시 됩 니 다)
[root@centos7 ~]# seq 5|sed 'N;D'  
5
[root@centos7 ~]# seq 5|sed 'N;N;D'   
3
4
5
d 인쇄 모드 공간 에서 첫 줄 내용
[root@centos7 ~]# seq 10|sed -n 'N;P' 
1
3
5
7
9
[root@centos7 ~]# seq 10|sed -n 'N;N;P'
1
4
7
#             
[root@centos7 ~]# seq 10|sed -n '1~3P' 
1
4
7
10
P 공간 에 있 는 내용 으로 모드 공간 에 있 는 내용 을 교체 합 니 다.
[root@centos7 ~]# seq 5|sed -n 'g;N;s/
/xx/p' xx2 xx4 [root@centos7 ~]#
g 줄 바 꿈 자 를 모드 공간 에 추가 한 다음 에 공간 에 있 는 내용 을 줄 바 꿈 자 에 추가 합 니 다.(이때 모드 공간 에서 PATTERNHOLD 와 같은 내용 형)
[root@centos7 ~]# seq 5|sed 'G;s/
/xx/' 1xx 2xx 3xx 4xx 5xx
G 모드 공간의 내용 으로 공간 에 있 는 내용 을 교체 합 니 다 (이때 모드 공간의 내용 이 삭제 되 지 않 았 음 을 주의 하 십시오)
[root@centos7 ~]# seq 5|sed -n 'h;G;s/
/xx/p' 1xx1 2xx2 3xx3 4xx4 5xx5 [root@centos7 ~]# seq 5|sed -n 'h;G;G;s/
/xx/gp' 1xx1xx1 2xx2xx2 3xx3xx3 4xx4xx4 5xx5xx5
h 줄 바 꿈 자 를 추가 하여 공간 을 유지 한 다음 에 패턴 공간의 내용 을 줄 바 꿈 자 에 추가 합 니 다.(이 때 HOLDPATTERN 과 같은 공간 내용 을 유지 합 니 다)
[root@centos7 ~]# seq 3|sed -n 'H;G;s/
/xx/gp' 1xxxx1 2xxxx1xx2 3xxxx1xx2xx3 [root@centos7 ~]#
H 교환 모드 공간 과 공간 유지 내용
[root@centos7 ~]# seq 9|sed -n '1!{x;N};s/
//p' 3 25 47 69 # {...}
x 분기 명령 에 탭 위 치 를 지정 합 니 다 (주소 일치 허용 하지 않 음): label 무조건 label 분기 로 이동 합 니 다. label 을 생략 하면 전체 명령 의 끝 으로 이동 합 니 다 (즉, 다음 읽 기 시작)
#   xml       (        ,    )
sed '//!{N;ba};d}' server.xml
#          N,   -->           
#  nagios      ,   define host{...}   ,    :
define host{
use windows-server
host_name serverA
hostgroups 060202
alias 060202
contact_groups yu
address 192.168.1.1
}
#      ip   192.168.1.1  ,    :
sed -i '/define host/{:a;N;/}/!ba;/192\.168\.1\.1/d}' file
#            
b label 한 번 입력 한 후에 성공 적 으로 실 행 된 t label 교체 명령 이 있어 야 label 로 넘 어 갑 니 다. label 을 생략 하면 전체 명령 의 끝 (즉 다음 읽 기 시작) 으로 넘 어 갑 니 다.
#     
[root@centos7 ~]# seq 10|sed ':a;$!N;s/
/,/;ta' 1,2,3,4,5,6,7,8,9,10 [root@centos7 ~]# # MAC 78A35114F798 78:A3:51:14:F7:98 [root@centos7 temp]# echo '78A35114F798'|sed -r ':a;s/\B\w{2}\b/:&/;ta' 78:A3:51:14:F7:98 [root@centos7 temp]# # \b ,\B # : [root@centos7 temp]# echo '78A35114F798'|sed -r 's/..\B/&:/g' 78:A3:51:14:F7:98 [root@centos7 temp]#
s 한 번 입력 한 후 교체 명령 이 성공 적 으로 실행 되 지 않 으 면 label 로 이동 합 니 다. label 을 생략 하면 전체 명령 의 끝 으로 이동 합 니 다 (즉, 다음 읽 기 시작)T label 모드 공간의 내용 을 제거 하고 z 와 같은 역할 을 하지만 더욱 효과 적 임 을 나타 낸다.
더 많은 예
1. 일치 하 는 줄 의 이전 줄 과 다음 줄 삭제
#         seq 10   (              )
#      5           
[root@centos7 temp]# seq 10|sed -n '$!N;/
5/{s/.*
//p;N;d};P;D' 1 2 3 5 7 8 9 10

2. 홀수 줄 병합
#       seq 11   ,                 
#     `1 3 5 7 9 11`,   `2 4 6 8 10`
[root@centos7 ~]# seq 11|sed -nr '$!N;2!G;s/([^
]+)
((.+)
)?(.+)
(.+)/\4 \1
\5 \3/;h;$p' 1 3 5 7 9 11 2 4 6 8 10 [root@centos7 ~]#

3. 다 중 파일 통합
#  a.txt   :
01 12510101 4001
02 12310001 4002
03 12550101 4003
04 12610001 4004
05 12810001 4005
06 12310001 4006
07 12710001 4007
08 12310001 4008
09 12810101 4009
10 12510101 4010
11 12310001 4011
12 12610001 4012
13 12310001 4013
#  b.txt   :
A 12410101 2006/02/15 2009/01/31 4002
B 12310001 2006/08/31 2008/08/29 4001
C 12610001 2008/05/23 2008/05/22 4002
D 12810001 1992/12/10 1993/06/30 4001
E 12660001 1992/05/11 1993/06/01 4005
#    a.txt       b.txt        ,   b.txt         。
#  :02 12310001 4002 2006/08/31 2008/08/29
sed -rn '/^[01]/ba;H;:a;G;s/^((..)( .*)( [^
]+)).*\3(( [^ ]*){2}).*/\1\5/p' b.txt a.txt # awk , : awk 'NR==FNR{a[$2]=$3FS$4;next}{if($2 in a)print $0,a[$2]}' b.txt a.txt

sed 의 각종 명령 특성 에 대한 이 해 를 강화 하기 위해 서 이 세 가지 예 를 스스로 분석 하 십시오.
각종 명령 의 조합 사용 에 정규 표현 식 의 강력 한 능력 을 더 해 s/.*// 계산 할 수 있 는 모든 문 제 를 처리 할 수 있 습 니 다.그러나 코드 의 가 독성 이 강하 지 않 아 이해 하기 가 어렵 기 때문에 보통 sed 을 텍스트 편집기 로 사용 하여 텍스트 에 대해 비 상호작용 적 인 흐름 처 리 를 한다.상기 각 명령 의 의 미 를 이해 하고 능숙 하 게 사용 하면 sed 의 강 한 점 을 발견 할 수 있다.

좋은 웹페이지 즐겨찾기