Shell指令碼之sed詳解

germany006發表於2014-05-22
轉載地址:http://tanxin.blog.51cto.com/6114226/1208944
作者:txweeds

          Shell指令碼之sed詳解

一, 基本概述

(1)基本介紹

sed是一款流編輯工具,用來對文字進行過濾與替換工作,  sed透過輸入讀取檔案內容,但一次僅讀取一行內容進行某些指令處理後輸出,sed更適合於處理大資料檔案。
(2)工作原理

sed在處理文字檔案的時候,會在記憶體上建立一個模式空間,然後把這個檔案的每一行調入模式空間用相應的命令處理,處理完輸出;接著處理下一行,直到最後。

(3)與vim的區別

vim需要通知處理檔案的哪幾行才會去處理,sed預設會處理檔案的所有行,除非你告訴它不處理哪幾行。

二, sed的基本語法

(1)sed [選項]  [定址commands] [inputfile]

關於定址:

定址可以是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, 列印基數行(從第一行開始,每隔一行一輸出)

cat -n t1 | sed -n '1~2p'

@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,刪除第一行

cat -n t1 |sed '1d'

@2,刪除第一行和第三行(與-e選項合用)

cat -n t1 |sed -e '1d' -e 3d

@3,;選項的使用和-e一樣

cat -n t1 |sed '1d;3d'

@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        可以修改原檔案

cat tx
11111111

22222222

33333333
44444444
55555555
sed -i 's/1/A/g' tx
cat tx
AAAAAAAA

22222222

33333333
44444444
55555555

(11)-f 支援指令碼

cat sed.sh
li hello
/^$/d
$a byebye
sed -f sed.sh tx

四.sed如何處理資料


    PATT:模式空間,處理檔案的輸入行,處理檔案的空間,最多儲存8192位元組,相當於車間sed把流內容在這裡處理。

    HOLD:保留空間,用來儲存已經處理的輸入行;最多儲存8192位元組;預設有一個空行,相當於倉庫,加工的半成品在這裡臨時儲存。


COMM:命令

h:將模式空間裡的內容,複製到保留空間裡,覆蓋原來的內容 >

H:將模式空間裡的內容,追加到保留空間裡,保留原來的內容 >>

g:將保留空間裡的內容,複製到模式空間裡,覆蓋原來的內容

G:將保留空間裡的內容,追加到模式空間裡,保留原來的內容

n:對匹配行的下一行進行處理

x:交換模式空間和保留空間的內容

(1)h;G

@1.將第一行的內容放到打三行後面

cat tx
11111111
22222222
33333333
44444444
55555555
sed '1h;3G' tx

11111111
22222222
33333333

11111111

44444444
55555555




@2.在每行的後面新增1個空行

注:1.保留空間裡預設有一個空白行。2,‘G’預設處理全域性

sed '1,$G' tx

11111111

22222222

33333333

44444444

55555555
sed 'G' tx

11111111

22222222

33333333

44444444

55555555




@3.把第1行到第4行的資料複製到第5行後面

注:1h是為了覆蓋保留空間裡的空白行

sed '1h;2,4H;5G' tx
11111111
22222222
33333333
44444444
55555555

11111111
22222222
33333333
44444444


@4. 把第1行到第4行的資料剪下到第5行後面

sed '1h;2,4H;1,4d;5G' tx

55555555

11111111
22222222
33333333
44444444



(2)n    對匹配行的下一行進行處理

cat tx

11111111
22222222
33333333
44444444
55555555

sed -n '1n;p' tx

22222222
33333333
44444444
55555555




(3)x     交換模式空間和保留空間的內容

sed '1h;3x' tx

11111111
22222222

11111111

44444444
55555555





本文出自 “tanxin” 部落格,請務必保留此出處http://tanxin.blog.51cto.com/6114226/1208944



自我總結:
 sed -n '1~2p'  列印奇數行
 sed -n '0~2p'  列印偶數行

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-1167910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章