sed基本用法

 

Sed是行處理命令,處理的過程是逐行將需要處理數據讀入到模式空間處理,處理完成打印(默認)模式空間內容並清空模式空間,所以除非是添加特殊參數(-i),否則sed是不會修改文本內容,參數(-n)是不打印緩存空間內容,其他參數內容見下列表

 

常用選項

 

命令

功能

-n

屏蔽模式空間的自動打印,否則每行處理結束會自動打印

-i

在適當的位置修改文件(直接在文件中修改,慎用!!!)

-r

使用擴展正則表達式

-e

多項操作

-f

添加腳本文件內容到命令

 

定址查找

Shell> Seq 3| sed –n ‘2p’

2

##打印第2

 

範圍查找

Shell> seq3 | sed –n ‘1,2p’

1

2

## 打印第1行到第2

 

多項查找-e

Shell> seq 3 | sed –n –e ‘1p’ –e ‘3p’

1

3

##打印第1行和第3

 

 /…/查找內容,查找值

Shell> seq 2 4 | sed –n ‘2,3p’

3

4

##打印第2行到第3

Shell> seq 2 4 | sed –n ‘/2/,/3/p’

2

3

## 打印匹配2到匹配3的行之間的所有行內容

功能表

命令

功能

=

打印當前行號

a\

在當前模式緩存後添加一行或多行。除最後一行外,每行末尾需用“\”續行

c\

替換當前模式緩存爲一行或多行文本。除最後一行外,每行末尾需用"\"續行

i\

在當前模式緩存前插入一行或多行。除最後一行外,每行末尾需用"\"續行

d

***模式空間,開始下一個操作

h

複製模式緩存到保留(暫時)緩存

H

添加模式緩存到保留(暫時)緩存

g

複製保留(暫時)緩存到模式緩存

G

添加保留(暫時)緩存到模式緩存

l

列出非打印字符

p

打印當前模式緩存

n

讀入下一行到模式緩存

N

添加下一行到模式緩存

q

結束或退出sed

r

從文件中讀取輸入文本

!

對所選行以外的所有行應用命令

s

用一個字符串替換另一個

g

在行內進行全局替換

$

 末尾行

w

寫入當前模式空間到文件

W

寫入當前模式空間的第一行到文件

x

交換保留緩存和模式緩存的內容

y

將字符替換爲另一字符(不能對正則表達式使用y命令)

Addr,+N

處理當前行直到當前行之後N

Addr,~N

處理當前行到第N行,等同於addr,N

n~m

n行開始每m行匹配一次,sed –n ‘1~2p’奇數行打印

 

常用參數舉例

例:

添加行a

Shell> seq 3 | sed ‘/2/a\

>2+1\

>2+2’

1

2

2+1

2+2

3

## 在匹配2的行後面添加2+1,2+2

 

插入行i

Shell> seq 3 | sed ‘/2/i\

>3-1\

>3-2’

1

3-1

3-2

2

3

##在匹配2的行之前添加3-1,3-2

 

修改行c

Shell> seq 3 | sed ‘/2/ctwo’

1

two

3

##修改匹配2的行爲two

Shell> seq 3 | sed ‘/3/c\

>three\

>four’

1

2

three

four

##修改匹配3的行位three \n four

 

***行d

Shell> seq 3 | sed ‘/2/d’

1

3

## ***匹配2的行

 

列出打印行l(通常結合-n使用)

Shell> seq 3 | sed ‘/2/l’

2

2$

2

3

Shell> seq 3 | sed –n ‘/2/l’

2$

 

打印行p(通常結合-n使用)

Shell> seq 3 | sed ‘/2/p’

1

2

2

3

Shell> seq 3 | sed –n ‘/2/p’

2

 

結束和退出sed q(如果把sed比作一個循環,q就相當於break-n結合d就相當於continue)

Shell> seq 3 | sed ‘/2/q’

1

2

 

選擇取反執行命令!

Shell> seq 3 | sed ‘/2/d’

1

3

Shell> seq 3 | sed ‘/2/!d’

2

 

用一個字符串替換一個字符串s

Shell> seq 3 | sed ‘s/2/two/’

1

two

3

 

全局替換g

Shell> seq 10 12 | sed ‘s/1/one/’

one0

one1

one2

Shell> seq 10 12 | sed ‘s/1/one/g’

one0

oneone

one2

 

行尾標識$

Shell> seq 10 12 | sed ‘s/1$/one/g’

10

1one

12

 

行首標識^

Shell> seq 10 12 | sed ‘s/^1/one/g’

One0

One1

One2

 

寫入當前模式空間內容到文件

Shell> seq 3 | sed –n ‘2wpp’

Shell> cat pp

2

 

轉換模式空間的字符爲另一個字符(y/source/dest/

Shell> seq 212 214 | sed ‘y/1/a/’

2a2

2a3

2a4

 

對多個字符同時轉換(不能轉換字符串)

Shell> seq 212 214 | sed ‘y/12/IR/’

RIR

RI3

RI4

 

追加一個空行

Shell> seq 3 | sed ‘/2/G’

1

2

 

3

 

插入一個空行

Shell> seq 3 | sed ‘/2/{x;p;x}’

1

 

2

3

## 追加空行和添加空行都是利用了模式空間和暫存空間的原理來實現

 

n; addr,+n; addr,~n; n~m,幾個參數的應用

打印奇數行

Shell> seq 5 | sed ‘n;d’

1

3

5

Shell> seq 5 | sed ‘2~2d’

1

3

5

Shell> seq 5 | sed –n ‘1~1p’

1

3

5

 

模擬緩存和暫存緩存應用

模擬tac

Shell> seq 3 | sed ‘1!G;h;$!d’

3

2

1

 

模擬rev

Shell> echo `seq 3` | sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//’

3 2 1

 

元字符

元字符

功能

示例

^

行首定位符

/^my/ 匹配所有以my開頭的行

$

行尾定位符

/my$/ 匹配所有以my結尾的行

.

匹配除換行符以外的單個字符

/m..y/ 匹配包含字母m,後跟兩個任意字符,再跟字母y的行

*

匹配零個或多個前導字符

/my*/ 匹配包含字母m,後跟零個或多個y字母的行

[]

匹配指定字符組內的任一字符

/[Mm]y/ 匹配包含Mymy的行

[^]

匹配不在指定字符組內的任一字符

/[^Mm]y/ 匹配包含y,但y之前的那個字符不是Mm的行

\(..\)

保存已匹配的字符

1,20s/\(you\)self/\1r/ 標記元字符之間的模式,並將其保存爲標籤1,之後可以使用\1來引用它。最多可以定義9個標籤,從左邊開始編號,最左邊的是第一個。此例中,對第1到第20行進行處理,you被保存爲標籤1,如果發現youself,則替換爲your

&

保存查找串以便在替換串中引用

s/my/**&**/ 符號&代表查找串。my將被替換爲**my**

\<

詞首定位符

/\<my/ 匹配包含以my開頭的單詞的行

\>

詞尾定位符

/my\>/ 匹配包含以my結尾的單詞的行

x\{m\}

連續mx

/9\{5\}/ 匹配包含連續59的行

x\{m,\}

至少mx

/9\{5,\}/ 匹配包含至少連續59的行

x\{m,n\}

至少m個,但不超過nx

/9\{5,7\}/ 匹配包含連續579的行

 

例:

匹配開頭^(既即行首字符)

Shell> swq 12 3 21

12

15

18

21

Shell> seq 12 3 21 | sed –n ‘/^2/p’

21

 

匹配結尾$(即行尾字符)

Shell> seq 12 3 21 | sed –n ‘/2$/p’

12

 

匹配一個字符.

Shell> seq 9 2 19

9

11

13

15

17

19

Shell> seq 9 2 19 | sed –n ‘/.9/p’

19

 

匹配0個或多個字符*

Shell> seq 11 13 | sed –n ‘/12*/p’

11

12

13

## 這個理解起來有些複雜,參考上例12*匹配的是包含1121221222…的所有字符,即匹配的是1後面跟0個或者多個2的字符竄

 

匹配指定字符的任意一個[]

Shell> seq 19 21 | sed –n ‘/[12][92]/p’

19

21

##上例匹配了11,19,21,29四個字符串

 

匹配指定字符以外的字符[^]

Shell> seq 3 | sed –n ‘/[^2]/p’

1

3

## ^是行首字符,結合[]使用就變成了取非效果,與shell正則表達相同

 

保存已經匹配的字符\(…\)

Shell> seq 19 21 | sed ‘s/2\(.\)/two\1/g’

19

two0

two1

## 替換2後面任意字符爲two後面任意字符

 

匹配查找的字符串&

Shell> seq 100 102 | sed ‘s/10[0-9]/&a/g’

100a

101a

102a

## 這裏&=10[0-9]

 

匹配單詞開頭\<

Shell> echo “109 901 910 102” | sed ‘’s/1/one/g

One09 90one 9one0 one02

Shell> echo “109 901 910 102” | sed ‘s/^1/one/g’

One09 901 910 102

Shell> echo “109 901 910 102” | sed ‘s/\<1/one/g’

One09 901 910 one02

## \<^都是匹配開頭,不同的是\<分隔符是空格,TAB和換行,^分隔符是換行

 

匹配單詞結尾\>

Shell> echo “109 901 910 102” | sed ‘s/1\>/one/g’

109 90one 910 102

## 同上解

 

匹配M個相同字符a{m}

Shell> ifconfig | sed –n ‘/[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}/p’

Inet addr: 192.168.254.123    Bcast:192.168.254.255   Mask:255.255.255.0

 

##只有所有位都是3的地址是被匹配的

匹配M-N個相同字符a{n,m}

Shell> ifconfig  |sed –n “/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p”

Inet addr: 192.168.254.123    Bcast:192.168.254.255   Mask:255.255.255.0

Inet addr:127.0.0.1Mask:255.0.0.0

## 所有地址都被匹配

 

匹配大於等於N個相同字符a{n,}

Shell> ifconfig | sed –n ‘/[0-9]\{1,\}\. [0-9]\{1,\}\. [0-9]\{1,\}\. [0-9]\{1,\}/p’

Inet addr: 192.168.254.123    Bcast:192.168.254.255   Mask:255.255.255.0

Inet addr:127.0.0.1Mask:255.0.0.0

## 所有地址都被匹配

 

應用

替換my.cnf所有IP地址爲本地IP地址

Shell> mv /etc/mysql/my.cnf /etc/mysql/my.cnf.old;\

IP=`ifconfig | awk ‘{FS=”[ |:]+”} NR==2 {print $4}’`;\

sed  “/bind-address/c\

bind-address\t\t\t\t= $IP” /etc/mysql/my.cnf.old> /etc/mysl/my.cnf

 

||

shell> IP=`ifconfig | awk ‘{FS=”[ |:]+” NR==2 {print $4}}’`;\

sed -i “/bind-address/c\

bind-address\t\t\t\t= $IP” my.cnf

## 推薦用第一種方法,雖然麻煩點,可以避免誤操作

 

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