1. 程式人生 > >sed命令詳解

sed命令詳解

sed命令

1.sed命令參數詳解

sed [options] [function] [input-file]

sed 選項動作輸入文件

選項與參數

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來.如:sed -n ‘2,5p‘ sed.txt(2-5行打印出來)

-e :直接在命令列模式上進行 sed 的動作編輯;

-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;

-r sed 的動作支持的是延伸型正規表示法的語法。

(默認是基礎正規表示法語法)

-i :直接修改讀取的文件內容,而不是輸出到終端。

動作說明 [n1[,n2]]function

n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 20 行之間進行的,則『 10,20[動作行為]

function

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!如:sed 2c fengxiaoli sed.txt(把第二行替換為fengxiaoli,不常用)

d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)

p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g

2.sed命令執行的地址範圍

10[function]匹配到第10

10,20[function]匹配到10-20

10,+20[function]匹配10行開始之後的20

1~2[function]匹配(以1開頭 2間隔)1,3,7,9

2~2[function]匹配 2468

10,$[function]匹配10行到結尾

/zhangyao/[function]匹配有

zhangyao的那一行

/zhangyao/,/Alex/[function]匹配有zhangyao的那一行到有Alex的那一行,若有重復字符串請自行測試

/zhangyao/,$[function]匹配有zhangyao的那一行到結尾

10,/Alex/[function]匹配10行到有Alex的那一行

/zhangyao/,+20[function]匹配有zhangyao的那一行開始之後的20

/Alex/,10[function]匹配有Alex的那一行到10

3.增刪查改

3.1增加(可以指定上面的範圍測試)

sed ‘2a 3fengxiaoli‘ sed.txt(a增加在第二行的後面)

sed ‘2a 3fengxiaoli\n4wangcheng‘ sed.txt(多行增加)

sed ‘2i fengxiaoli‘ sed.txti增加在第二行的前面)

3.2刪除(可以指定上面的範圍測試)

sed ‘2d‘ sed.txt (刪除第二行)

sed ‘2,5d‘ sed.txt (刪除2-5行)

3.3.1替換(可以指定範圍,不指定範圍就是替換全部匹配的字符串)

sed s#替換之前字符串#替換之後字符串#g sed.txt

sed s/替換之前字符串/替換之後字符串/g sed.txt

1sed -i ‘5s#disabled#enforcing#g‘ /etc/selinux/config

3.3.2分組替換

echo I am oldboy teacher |sed ‘s#^.*am \([a-z].*\) tea.*$#\1#g‘

(藍色的是任意以am開頭,tea任意結尾;紅色的\([a-z].*\) 是替換之後的內容,也就是oldboy,替換之後以\1輸出;小括號是擴展正規表達式,如果沒加-r需要\轉義)

echo I am oldboy teacher |sed ‘s#I \(.*\) \([a-z].*\) tea.*$#\1 \2#g‘(最多只支持9個括號)

3.33Ms# # #Ng

Ms M行操作,無g標誌則對匹配的第1列處理,有g則對這一行處理

如:

[[email protected] test]# cat sed.txt

1 1 1 1

1 1 1 1

1 1 1 1

[[email protected] test]# sed ‘s#1#0#‘ sed.txt

0 1 1 1

0 1 1 1

0 1 1 1

Ng 從第N處列開始到結尾替換

[[email protected] test]# sed ‘s#1#0#2g‘ sed.txt

1 0 0 0

1 0 0 0

1 0 0 0

Mg Ng 對第M行從第N處到結尾匹配替換

[[email protected] test]# sed ‘2s#1#0#2g‘ sed.txt

1 1 1 1

1 0 0 0

1 1 1 1

企業案例1

[[email protected] ~]# chkconfig --list |grep 3:on|grep -Ev "sshd|crond|network|rsyslog|sysstat"|awk ‘{print $1}‘|sed -r ‘s#(.*)#chkconfig \1 off#g‘

chkconfig abrt-ccpp off

chkconfig abrtd off

chkconfig acpid off

chkconfig atd off

chkconfig auditd off

chkconfig autofs off

...................

案例2

[[email protected] test]# for i in {1..5};do touch stu_10299_${i}_finished.jpg;done

[[email protected] test]# ls

stu_10299_1_finished.jpg stu_10299_3_finished.jpg stu_10299_5_finished.jpg

stu_10299_2_finished.jpg stu_10299_4_finished.jpg

[[email protected] test]# ls *.jpg|sed -r ‘s#(.*)_finished.*#mv & \1.jpg#g‘(這裏&表示原來的文件名)

mv stu_10299_1_finished.jpg stu_10299_1.jpg

mv stu_10299_2_finished.jpg stu_10299_2.jpg

mv stu_10299_3_finished.jpg stu_10299_3.jpg

mv stu_10299_4_finished.jpg stu_10299_4.jpg

mv stu_10299_5_finished.jpg stu_10299_5.jpg

3.4(打印)

sed -n ‘2p‘ sed.txt-n 參數一般和p連用)

sed -n s#zhangyao#NB#p sed.txt

4.修改文件

sed -i ‘s#vn#fengxiaoli#g‘ sed.txt

[[email protected] test]# sed -i.back ‘s#vnsvf#fengxiaoli#g‘ sed.txt (修改文件的同時將源文件備份)

[[email protected] test]# cat sed.txt

adfja

qwianf

ariung

ljjqf

fengxiaoli

[[email protected] test]# cat sed.txt.back

adfja

qwianf

ariung

ljjqf

vnsvf

5.1忽略大小寫舉例

[[email protected] test]# cat sed.txt

adfja

qwianf

ariung

ljjqf

FENGxiaolisvf

[[email protected] test]# sed ‘s#fengxiaolisvf#fengxiaoli#gi‘ sed.txt

adfja

qwianf

ariung

ljjqf

fengxiaoli

5.2改變指定位置大小寫

[[email protected] test]# cat sed.txt

ceo,101,OLDBOY

cto,102,ZHANGYAO

coo,103,ALEX

cfo,104,YY

cio,105,FEIXUE

[[email protected] test]# sed -r ‘s#(.*),(.*),(.*)#\L\3, \E\1, \U\2#g‘ sed.txt

oldboy, ceo, 101

zhangyao, cto, 102

alex, coo, 103

yy, cfo, 104

feixue, cio, 105

註:\l在替換字符中使用\l標誌時,它會把緊跟在其後面的第一個字符當做小寫字符處理

\L在替換字符中使用\L標誌時,它會把緊跟在其後面的所有字符當做小寫字符處理

\u在替換字符中使用\u標誌時,它會把緊跟在其後面的第一個字符當做大寫字符處理

\U在替換字符中使用\U標誌時,它會把緊跟在其後面的所有字符當做小寫字符處理

\E需要和\U或者\L一起使用,它將關閉\U或者\L的功能

6.sed用等號顯示行號

[[email protected] test]# sed ‘=‘ sed.txt

1

ceo,101,OLDBOY

2

cto,102,ZHANGYAO

3

coo,103,ALEX

4

cfo,104,YY

5

cio,105,FEIXUE

7.一條sed語句執行多條sed命令

如例1sed 3,$d sed.txt |sed s#10#01#g

2sed -e 3,$d -e s#10#01#g’’ sed.txt

3sed 3,$d;s#10#01#g sed.txt(建議用這種最簡單)

4

[[email protected] test]# cat sed_jiaoben.txt

3,$d

s#10#01#g

[[email protected] test]# sed -f sed_jiaoben.txt sed.txt

註:該四條命令執行結果相同

企業案例:一個文件100行,把53570行單獨拿出來

sed -n ‘5p;35p;70p‘ sed.txt

8.特殊符號大括號

[[email protected] test]# sed -n ‘2,4{p;=}‘ sed.txt

cto,102,ZHANGYAO

2

coo,103,ALEX

3

cfo,104,YY

4

註:大括號裏的意思是先顯示2-4行,然後在顯示2-4行的行號

9.2行變為1

[[email protected] test]# sed ‘=‘ sed.txt

1

ceo,101,OLDBOY

2

cto,102,ZHANGYAO

3

coo,103,ALEX

4

cfo,104,YY

5

cio,105,FEIXUE

註用N參數後其實是

1\nceo,101,OLDBOY

2\ncto,102,ZHANGYAO

3\ncoo,103,ALEX

4\ncfo,104,YY

5\ncio,105,FEIXUE

然後再將\n替換為空格

[[email protected] test]# sed ‘=‘ sed.txt|sed ‘N;s#\n# #‘

1 ceo,101,OLDBOY

2 cto,102,ZHANGYAO

3 coo,103,ALEX

4 cfo,104,YY

5 cio,105,FEIXUE

企業案例

[[email protected] test]# cat sed.txt

1412412

dsnafan

243124

dfafdaf

2134125

adafafa

[[email protected] test]# sed ‘N;s#\n#=#g‘ sed.txt

1412412=dsnafan

243124=dfafdaf

2134125=adafafa

本文出自 “feng” 博客,請務必保留此出處http://fengxiaoli.blog.51cto.com/12104465/1947413

sed命令詳解