linux shell 中sed用法

轉自:http://www.360doc.com/content/16/1118/16/38309198_607576538.shtml


一, 基本概述

(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, 打印基數行(從第一行開始,每隔一行一輸出)

@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     交換模式空間和保留空間的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章