sed

目錄
簡介 1
調用方式 2
選項 2
命令集合 2
尋址 3
基本用法 4
文件讀入寫出 5
附加-插入-修改文本 5
刪除文本 6
替換文本 6
轉換文本 8
補充 8


簡介

簡介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一個“非交互式的”字符流編輯器(stream editor)

Sed是一非交互性文本編輯器,它編輯文件或標準輸入導出的文本拷貝,標準輸入可能來自鍵盤、文件、重定向、字符串、變量或一管道文件

 

sed主要用來自動編輯一個或多個文件(替換、插入、刪除、追加、更改……);簡化對文件的反覆操作;編寫轉換程序等

 

【對進入的數據進行全局的處理,增加,刪除,修改某些部分,得出結果】

處理過程

1.處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space)

2.接着用sed命令處理緩衝區中的內容,

3.處理完成後,把緩衝區的內容送往屏幕。

4.接着處理下一行或多行,這樣不斷重複,直到文件末尾

 

文件內容並沒有改變,除非你使用重定向或寫入命令存儲輸出

主要作用:

1. 抽取域

2. 匹配正則表達式

3. 比較域

4. 增加、附加、替換

 

調用方式

調用方式:

1. 命令行輸入

sed [options] 'command' file(s)

2. 使用sed腳本

sed [options] -f scriptfile file(s)

3. 使sed腳本可執行

在腳本第一行具有sed命令解釋器

Sed腳本文件 [選項]輸入文件

sed–f sedScriptFile targetFile

 

選項

選項:

-n

--quiet, --silent 取消默認輸出

不打印,不寫編輯行到標準輸出,缺省情況下打印所有行[編輯/未編

輯]p命令可以打印編輯行

-f

調用sed腳本sed –f sedScriptFile targetFile

-c

下一命令是編輯命令,使用多項編輯時加入此選項

-e command

--expression=command   允許多條編輯命令

-h

--help打印幫助,並顯示bug列表的地址

-V

--version 打印版本和版權信息

 

命令集合

命令集合:

a\

定位行號後附加新文本信息 append

b lable

分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾

c\

用新的文本改變本行的文本,用新文本替換定位文本  change

d

從模板塊(Pattern space)位置刪除行  刪除定位行  delete

D

刪除模板塊的第一行

i\

定位行號後插入  insert

h

拷貝模板塊的內容到內存中的緩衝區

H

追加模板塊的內容到內存中的緩衝區

g

獲得內存緩衝區的內容,並替代當前模板塊中的文本

獲得內存緩衝區的內容,並追加到當前模板塊文本的後面

l

列表不能打印字符的清單 將非打印字符顯示爲兩個數字的ASCII代碼

n

讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令

追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼

打印匹配行 print

P(大寫)

打印模板塊的第一行

退出Sed  第一個模式匹配完成後退出或立即退出

r file

從file中讀行  從另一個文件中讀文本 read

t label 

if分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾

T label

錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾

w file

寫並追加模板塊到file末尾 寫文本到一個文件  write

W file

寫並追加模板塊的第一行到file末尾

y

傳送字符

!

表示後面的命令對所有沒有被選定的行發生作用

s/re/string 

用string替換正則表達式re  使用替換模式替換相應模式

=

打印匹配行行號

把註釋擴展到下一個換行符以前

{}

定位執行命令組

替換標記

1)g表示行內全面替換。   

2)p表示打印行。   

3)w表示把行寫入一個文件。   

4)x表示互換模板塊中的文本和緩衝區中的文本。   

5)y表示把一個字符翻譯爲另外的字符(但是不用於正則表達式)

 

尋址方式

尋址:

sed命令可以指定零個、一個或兩個地址。每個地址都是一個描述模式、行號、或者行尋址

符號的正則表達式。

如果沒有指定地址,那麼命令將應用於每一行。

如果只有一個地址,那麼命令將應用於與這個地址匹配的任意行。

如果指定了由逗號分隔的兩個地址,那麼命令應用於匹配第一個地址的第一行和他後面的

行,直到匹配第二個地址的行(包括此行)。

 

如果地址後面跟有感嘆號(!),那麼命令就應用於不匹配該地址的所有的行。

定位命令

x

行x

X,y

行x到行y

/pattern/

模式

/pattern/pattern/

兩個模式

/pattern/,x

 

模式+行【在給定行號上查詢模式】

X,y /pattern/

通過行號和模式查詢匹配行

X,y!

不包含指定行號

 

基本用法

示例:[dream爲數據文件]

基本用法——匹配&打印

1. 顯示第二行

$sed –n ‘2p’ dream

2. 顯示一到三行

$sed –n ‘1,3p’ dream

3. 匹配模式

$sed –n ‘/dreamb/’p dream

4. 使用模式和行號進行匹配

$sed –n ‘4,/The/’p dream

【只能加一個行號,不能變爲區間】

5. 打印匹配行行號

$sed –n ‘/dream/=’ dream

6. 匹配元字符

$sed –n ‘/\$/’p dream

7. 顯示整個文件

$sed –n ‘1,$p’ dream

8. 匹配字符串

$sed –n ‘/.*ing/’p dream

9. 首行

$sed –n ‘1p’ dream

10.行號打印

$sed –e ‘/music/=’ quote.txt  整個文件並打印匹配行號

$sed –n ‘/music/=’ quote.txt  只打印匹配行號

11. 

sed –n “/^title/p” auction.xml#精確匹配以title開頭,打印此行

sed -n "/pict/,5p" auction.xml #指定具體行匹配

sed –n “/\<doc\>/p” auction.xml #匹配正則表達式

sed –n “/.*is/p” auction.xml#匹配任意字母

sed -n -e "/^title/p" -e "/^title/=" auction.xml #打印行號及匹配行

 

文件操作

文件讀入寫出

 

讀取文件:r命令

$ sed '/test/r file' example

file裏的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。   

 

寫入文件:w命令   可以使用重定向

$ sed -n '/test/w file' example

在example中所有包含test的行都被寫入file裏

 

注: 在命令和文件名之間必須有一個空格。每個腳本最多隻能打開10個文件

 

附加-插入-修改文本

附加/插入/修改文本

使用符號a\,可以將指定文本一行或多行附加到指定行,若不指定放置位置,默認放入第一行。

注:附加操作,結果到標準輸出,不能被編輯,必須存到另一個文件,再運行一個sed編輯

插入文本 i\   修改文本 c\

 

1. 匹配行後插入一行

$sed ‘/dreamb/a\”appended line”’ dream

【會自動換行】

2. 插入文本

$sed ‘2 i\ “inserted line”’ dream

【在第二行之前加一行】

sed "/user/ i\test" auction.xml

在匹配行前插入test

3. 修改文本

$sed ‘3 c\ “changed line”’ dream

【整行替換掉】

【注:可以用行,/正則/搞定】

 

刪除文本

刪除文本

命令格式:  [address[,address]] d

1. 刪除行

$sed ‘1d’ dream

$sed ‘1,3d’ dream

$ sed '2,$d' example  #第二行到末尾所有行

$ sed '$d' example-----刪除example文件的最後一行

2. 刪除匹配行

$sed ‘/dreamb/d’ dream

    $sed –n ‘/BEGIN/,/END/d’ myfile

 

替換文本

替換文本

格式:[address[,address]]s/pattern-find/replacement-pattern/[g,p,w,n]

n   1到512之間的一個數字,表示對本模式中指定模式第n次出現的情況進行替換。

g   對模式空間所有出現的情況進行全局更改【缺省只替換首次出現的模式 】

p   打印模式空間的內容

w   file

1. 替換

$sed ‘s/dreamb/DREAMB’ dream

【問題:這裏是如何執行的?報錯】

2. 全局替換

$sed ‘s/The/Wow!/g’ dream

3. 替換後重定向到文本

$sed ‘s/dreamb/Dream/w sed.out’ dream

【只輸出替換行】

4. 讀取部分寫入另一個文件

$sed ‘1,2 w filedt’ dream

$sed ‘/dream/ w filedt’ dream

【注: 在命令和文件名之間必須有一個空格。每個腳本最多隻能打開10個文件。】

5. 首次匹配後退出

$sed ‘/dream/q’ dream

【遇到匹配之前的內容還是要輸出的】

6. 顯示文件中的控制字符

格式: [ address[,address]]l

$sed –n ‘1,$l’ dream  【小寫字母l】

7. 去除行首數字

$sed ‘s/^[0-9]//g’ dream

8. Shell向sed傳值

$NAME=”go there”

$REP=”GO”

$echo $NAME | sed “s/go/$REP/g”      這裏必須雙引號【此時sed單引號不被解析】

9. 使用替換修改字符串(title前面加test)(注意和附件文本不要混淆)

sed -n "s/^title/test &/p" auction.xml

10.  $ sed 's#10#100#g' example

不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100

11.  $ sed 's/^192.168.0.1/&localhost/' example

&符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost

 

轉換文本

轉換文本

語法: [address]y/abc/xyz/

功能:字母表式的轉換

eg1

$ cat test.txt

1 cow

2 cow

3 pig

4 cow

$ sed 'y/cp/wd/' test.txt

1 wow

2 wow

3 dig

4 wow

(c轉換成w,p轉換成d)

 

eg2

$ sed '1,10y/abcde/ABCDE/' example

把1--10行內所有abcde轉變爲大寫,注意,正則表達式元字符不能使用這個命令

 

補充

sed補充:

分組

sed 使用大括號“{}”將一個地址嵌套在另一個地址中,或者在相同的地址上應用多個命令。

 

左大括號必須在行末,而且右大括號本身必須單獨佔一行。要確保在大括號之後沒有空格。

可以使用大括號將編輯命令括起來以對某個範圍的行應用多個命令。

 

$cat test.txt

1 cow

2 cow

3 pig

4 cow

$ cat test.sed

/^1/,/^3/{

       s/cow/pig/

       /^2/d

}

$ sed -f test.sed test.txt

1 pig

3 pig

4 cow

 

輸出到不同文件:

/^1/,/^3/{

       /^1/w 1out.txt

       /^2/w 2out.txt

       /^1/,/^3/w allout.txt

}

下一個

sed '/test/{ n; s/aa/bb/; }' example

如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變爲bb,並打印該行,然後繼續

 

退出

$ sed '10q' example-----打印完第10行後,退出sed

保持和獲取

$ sed -e '/test/h' -e '$G example

在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接着模式空間被清空,並存入新的一行等待處理。

在這個例子裏,匹配test的行被找到後,將存入模式空間

h命令將其複製並存入一個稱爲保 持緩存區的特殊緩衝區內。

當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中 的行的末尾

 

在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該文件的末尾。

保持和互換

$ sed -e '/test/h' -e '/check/x' example

互換模式空間和保持緩衝區的內容。也就是把包含test與check的行互換

同時執行多個命令

$ sed -e '1,5d' -e 's/test/check/' example

(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執 行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。   

 

$ sed --expression='s/test/check/' --expression='/love/d' example

 

簡單腳本示例

vi test.sed

s/pig/cow/g

[:~$] sed -f test.sed test.txt

cow

[:~$] cat test.txt

pig

 

簡單腳本示例:

[:~$] cat test.sh

 

sed '/^1/,/^3/{

s/cow/pig/

}' test.txt

[:~$] ./test.sh   

1 pig

2 pig

3 pig

4 cow

 

 

發佈了46 篇原創文章 · 獲贊 7 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章