Shell腳本之sed詳解正則表達式
一, 基本概述vim
(1)基本介紹bash
sed是一款流編輯工具,用來對文本進行過濾與替換工做, sed經過輸入讀取文件內容,但一次僅讀取一行內容進行某些指令處理後輸出,sed更適合於處理大數據文件。
(2)工做原理ide
sed在處理文本文件的時候,會在內存上建立一個模式空間,而後把這個文件的每一行調入模式空間用相應的命令處理,處理完輸出;接着處理下一行,直到最後。工具
(3)與vim的區別大數據
vim須要通知處理文件的哪幾行纔會去處理,sed默認會處理文件的全部行,除非你告訴它不處理哪幾行。ui
二, sed的基本語法spa
(1)sed [選項] [定址commands] [inputfile]3d
關於定址:blog
定址能夠是0個、1個、2個;通知sed去處理文件的哪幾行。
0個:沒有定址,處理文件的全部行
1個:行號,處理行號所在位置的行
2個:行號、正則表達式,處理被行號或正則表達式包起來的行
(2)
選項:
--version 顯示sed版本hao
--help 顯示幫助文檔
-n 關閉默認輸出,默認將自動打印全部行
-e 多點編輯,容許多個腳本指令被執行。
-r 支持擴展正則+ ? () {} |
-i 能夠修改原文件,慎用!
-f 支持使用腳本
命令:
p打印行
d 刪除行
s 替換
n替換第幾個匹內容
w另存爲
a 以後添加一行
i 當前行以前插入文本
y 替換匹配內容
三, 實際案例講解
(1)p(與-n合用)
查看passwd文件的1~3行
@1,打印一到三行
[root@tx3 ~]# cp /etc/passwd /t1
[root@tx3 ~]# cat -n t1 | sed -n '1,3p'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,查看passwd文件的lp~halt行
[root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p'
5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
@3, 打印基數行(從第一行開始,每隔一行一輸出)
@4,打印uid是0或1的行
[root@tx3 ~]# sed -n '/x:[01]:/p' t1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 刪除
@1,刪除第一行
@2,刪除第一行和第三行(與-e選項合用)
@3,;選項的使用和-e同樣
@4,取反:!
[root@tx3 ~]# cat -n t1 | sed '1!d'
1root:x:0:0:root:/root:/bin/bash
(3)s 查找替換 s///
語法:
'[address]s/pattern/replacement/flags'
old new
flags:
n:1-512 之間的正整數,表示替換模式裏面出現的第幾回內容
p:打印
g:全局修改
w:另存爲
這幾個選項是能夠複合使用的,可是寫的要有意義。(pg ;nw)
注:這裏爲部分截取
@1默認會替換行裏面的第1個匹配
[root@tx3 ~]# sed 's/root/ROOT/' t1
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@2所有替換
[root@tx3 ~]# sed 's/root/ROOT/g' t1
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@3替換第2個匹配
[root@tx3 ~]# sed 's/root/ROOT/2' t1
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@4打印
[root@tx3 ~]# sed 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin‘
[root@tx3 ~]# sed -n 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@5另存爲
[root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1
[root@tx3 ~]# cat /tx
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@6在文件的每行前面添加 # 註釋
[root@tx3 ~]# sed 's/^/#/' t1
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
@7刪掉文件的第1個字符
[root@tx3 ~]# sed 's/^.//1' t1
oot:x:0:0:root:/root:/bin/bash
in:x:1:1:bin:/bin:/sbin/nologin
aemon:x:2:2:daemon:/sbin:/sbin/nologin
@8刪掉文件的第2個字符
[root@tx3 ~]# sed 's/.//2' t1
rot:x:0:0:root:/root:/bin/bash
bn:x:1:1:bin:/bin:/sbin/nologin
(4)i 從當前行插入
在第一行前插入hello
[root@tx3 ~]# sed '1i hello' t1
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(5)a 從當前行後添加
在第一行後添加hello
[root@tx3 ~]# sed '1a hello' t1
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
(6)-r 支持擴展正則
[root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1
rot:x:0:0:root:/root:/bin/bash //至關於把前兩個字符替換成第一個字符,這樣就實現了刪除第二個字符
bn:x:1:1:bin:/bin:/sbin/nologin
demon:x:2:2:daemon:/sbin:/sbin/nologin
其餘方法:
@1#sed 's/.//2' t1
@2#sed 's/^\(.\)\(.\)/\1/' t1
(7)y 替換,按照位置來匹配替換 y/// 不識別re
[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
(8)替換匹配行
@1[root@tx3 ~]# sed -n '1c ROOT' t1
ROOT
(9)q 退出
[root@tx3 ~]# sed '1q ' t1
root:x:0:0:root:/root:/bin/bash
(10)-i 能夠修改原文件
(11)-f 支持腳本
四.sed如何處理數據
PATT:模式空間,處理文件的輸入行,處理文件的空間,最多保存8192字節,至關於車間sed把流內容在這裏處理。
HOLD:保留空間,用來保存已經處理的輸入行;最多保存8192字節;默認有一個空行,至關於倉庫,加工的半成品在這裏臨時儲存。
COMM:命令
h:將模式空間裏的內容,複製到保留空間裏,覆蓋原來的內容 >
H:將模式空間裏的內容,追加到保留空間裏,保留原來的內容 >>
g:將保留空間裏的內容,複製到模式空間裏,覆蓋原來的內容
G:將保留空間裏的內容,追加到模式空間裏,保留原來的內容
n:對匹配行的下一行進行處理
x:交換模式空間和保留空間的內容
(1)h;G
@1.將第一行的內容放到打三行後面
@2.在每行的後面添加1個空行
注:1.保留空間裏默認有一個空白行。2,‘G’默認處理全局
@3.把第1行到第4行的數據複製到第5行後面
注:1h是爲了覆蓋保留空間裏的空白行
@4. 把第1行到第4行的數據剪切到第5行後面
(2)n 對匹配行的下一行進行處理
(3)x 交換模式空間和保留空間的內容