[-]正則表達式
--------------------------------------------express
簡介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />緩存 |
一個「非交互式的」字符流編輯器(stream editor)app Sed是一非交互性文本編輯器,它編輯文件或標準輸入導出的文本拷貝,標準輸入可能來自鍵盤、文件、重定向、字符串、變量或一管道文件編輯器
sed主要用來自動編輯一個或多個文件(替換、插入、刪除、追加、更改……);簡化對文件的反覆操做;編寫轉換程序等ui
【對進入的數據進行全局的處理,增長,刪除,修改某些部分,得出結果】spa |
處理過程.net |
1.處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space)命令行 2.接着用sed命令處理緩衝區中的內容,翻譯 3.處理完成後,把緩衝區的內容送往屏幕。 4.接着處理下一行或多行,這樣不斷重複,直到文件末尾
文件內容並無改變,除非你使用重定向或寫入命令存儲輸出 |
主要做用: |
|
調用方式: |
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
在腳本第一行具備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爲數據文件] |
基本用法——匹配&打印 |
$sed –n ‘2p’ dream
$sed –n ‘1,3p’ dream
$sed –n ‘/dreamb/’p dream
$sed –n ‘4,/The/’p dream 【只能加一個行號,不能變爲區間】
$sed –n ‘/dream/=’ dream
$sed –n ‘/\$/’p dream
$sed –n ‘1,$p’ dream
$sed –n ‘/.*ing/’p dream
$sed –n ‘1p’ dream 10.行號打印 $sed –e ‘/music/=’ quote.txt 整個文件並打印匹配行號 $sed –n ‘/music/=’ quote.txt 只打印匹配行號 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\
$sed ‘/dreamb/a\」appended line」’ dream 【會自動換行】
$sed ‘2 i\ 「inserted line」’ dream 【在第二行以前加一行】 sed "/user/ i\test" auction.xml 在匹配行前插入test
$sed ‘3 c\ 「changed line」’ dream 【整行替換掉】 【注:能夠用行,/正則/搞定】 |
刪除文本 |
刪除文本 |
命令格式: [address[,address]] d
$sed ‘1d’ dream $sed ‘1,3d’ dream $ sed '2,$d' example #第二行到末尾全部行 $ sed '$d' example-----刪除example文件的最後一行
$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 |
$sed ‘s/dreamb/DREAMB’ dream 【問題:這裏是如何執行的?報錯】
$sed ‘s/The/Wow!/g’ dream
$sed ‘s/dreamb/Dream/w sed.out’ dream 【只輸出替換行】
$sed ‘1,2 w filedt’ dream $sed ‘/dream/ w filedt’ dream 【注: 在命令和文件名之間必須有一個空格。每一個腳本最多隻能打開10個文件。】
$sed ‘/dream/q’ dream 【遇到匹配以前的內容仍是要輸出的】
格式: [ address[,address]]l $sed –n ‘1,$l’ dream 【小寫字母l】
$sed ‘s/^[0-9]//g’ dream
$NAME=」go there」 $REP=」GO」 $echo $NAME | sed 「s/go/$REP/g」 這裏必須雙引號【此時sed單引號不被解析】
sed -n "s/^title/test &/p" auction.xml
不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,因此,「#」在這裏是分隔符,代替了默認的「/」分隔符。表示把全部10替換成100
&符號表示替換換字符串中被找到的部份。全部以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 |