目錄
簡介 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 |
獲得內存緩衝區的內容,並替代當前模板塊中的文本 |
G |
獲得內存緩衝區的內容,並追加到當前模板塊文本的後面 |
l |
列表不能打印字符的清單 將非打印字符顯示爲兩個數字的ASCII代碼 |
n |
讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令 |
N |
追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼 |
p |
打印匹配行 print |
P(大寫) |
打印模板塊的第一行 |
q |
退出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
|