sed-笔记
一.sed腳本編程的方法論
1.???????? 在著手做之前要弄清楚想做什么。
2.???????? 明確地描述處理的過(guò)程。
3.???????? 在提交最終的改變之前反復(fù)測(cè)試這個(gè)過(guò)程。
注1:檢測(cè)腳本最好的方式,是使用不同的輸入樣本進(jìn)行測(cè)試并觀察結(jié)果。
二.sed 的工作方式(原理)
sed 命令按順序逐行將文件讀入到內(nèi)存中。它一次處理一行內(nèi)容,以行為單位。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。期間還可以使用hold space的內(nèi)存緩沖空間作為二級(jí)緩沖處理。默認(rèn)輸出是將每一行的內(nèi)容輸出到屏幕上(標(biāo)準(zhǔn)輸出)。
其中兩個(gè)重要的因素:第一,輸出可以被重定向到另一文件中,以保存變化;第二,源文件(默認(rèn)地)保持不被修改。sed 默認(rèn)讀取整個(gè)文件并對(duì)其中的每一行進(jìn)行修改。不過(guò),可以按需要將操作限制在指定的行上。
三.命令語(yǔ)法
sed [options] '{command}' [filename]
1.???????? 選項(xiàng)與參數(shù):[-nefri]
-n ?:使用安靜(silent)模式。在一般 sed 的用法中,所有來(lái)自 STDIN 數(shù)據(jù)一般都會(huì)被列出到螢?zāi)簧稀5绻由?/span> -n 參數(shù)后,則只有經(jīng)過(guò)sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來(lái)。
-e :直接在命令列模式上進(jìn)行 sed 的動(dòng)作編輯;
-f : 直接將 sed 的動(dòng)作寫(xiě)在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)sed 動(dòng)作;
-r? :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語(yǔ)法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語(yǔ)法)
-i ?:直接修改讀取的文件內(nèi)容,而不是由螢?zāi)惠敵觥?/span>
2.???????? 命令說(shuō)明:
sed '[address]function'
首先地址是可選的,地址范圍(address)可以用:
?無(wú)????????????? 表示所有行,命令應(yīng)用于每一行。
例:d?????? ????刪除所有行。
n1???? ???????? 數(shù)字構(gòu)成,單個(gè)數(shù)字(n1)表示單獨(dú)的一行。
例:1d??????????刪除第一行。
n1,[n2] ? ? ? ??用逗號(hào)分隔( n1,[n2] )的兩個(gè)行數(shù)表示以這兩行為起止的行的范圍。
例:10,20d????? 刪除10到20行(包括第10和第20行)。
10,d ? ? ? ? ? ?刪除10行以上的所有行。
$???????????????尋址符號(hào)($)表示待處理文本的最后一行,與正則表達(dá)式中$(單個(gè)行結(jié)尾) ? ? ? ? ?不同。
?例:$d??????????刪除最后一行。
?!???????????????地址后跟 “!” 表示命令匹配該地址以外的所有行。
例:10!d????????刪除除了第10行以外的所有行。
RE????????????? 正則表達(dá)式作為地址提供,命令只影響與正則表達(dá)式匹配的行,正則表達(dá)式 ? ? ? ? ?必須封閉在斜杠”/“
例:/^$/d???????刪除所有空行。
常用動(dòng)作有:
a :新增,a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)。
例:sed? '2a string' ?filename
c? :取代,c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
例:sed ?'2c string' ?filename
d :刪除,d 后面通常不接任何字符;
例:sed ?'2d' ?filename
i :插入,i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行).
例:sed ?'2i' ?filename
p :打印/列出,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行。
例:sed ?'2p' ?filename
r :?從文件中讀取,后面接文件名稱,一個(gè)腳本最多打開(kāi)10個(gè)文件,文件不存在命令不會(huì)報(bào)錯(cuò)。
格式為:[line-address]r file? ? ? ? ? ? ? //操作單行,不能處理范圍內(nèi)的行。
例:sed '/test/r filename1' filename2 ? ? ? //filename1的內(nèi)容被讀取出來(lái),顯示在匹配的與test匹配的行的后面。
w : 將模式空間中內(nèi)容寫(xiě)到文件中,追加到文件中,不存在則創(chuàng)建。
格式為:[address]w file? ? ? ? ? ? ? ? ? ? //對(duì)行沒(méi)有限制,單行,多行都可以處理。
l : ?列表命令用于顯示模式空間的內(nèi)容,將非打印的字符顯示為兩個(gè)數(shù)字的ASCII代碼。其功能類似于vi 中的列表命令(:l)?
例:sed? -n l filename
y:? 轉(zhuǎn)換命令是特有的,按位置將字符串中abc每個(gè)字符,都轉(zhuǎn)換為xyz中的等價(jià)字符,在該地址范圍內(nèi)的所有的a 都被替換成了 x ,而不管它后面有沒(méi)有b。
格式為:[address]y/abc/xyz/
例:sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ
s :替換,可以直接進(jìn)行取代,通常這個(gè) s 的動(dòng)作可以搭配。
例:sed ?'s/old-value/new-value/g' filename
說(shuō)明:將”old-value”字符替為”new-value”字符
詳細(xì)用法:
[address]s/pattern/replacement/flags
flags是:
n? ? ?1-512之間的一個(gè)數(shù)字,表示文本模式中指定模式第n次出現(xiàn)的情況進(jìn)行替換。
#cat quanju
1hang-1hang-1hang
2hang-2hang-2hang
例:sed ‘s/hang/@/2’ quanju
1hang-1@-1hang
2hang-2@-2hang
說(shuō)明:替換每一行中第2個(gè)匹配的字符串。
g????對(duì)模式空間的所有出現(xiàn)的情況進(jìn)行全局更改。而沒(méi)有g通常只有第一次出現(xiàn)的情況被替換。
例:sed ‘s/hang/@/g’ quanju
1@-1@-1@
2@-2@-2@
p ? ?(小寫(xiě)p)打印模式空間的內(nèi)容。
w? ? ? (小寫(xiě)w)file 將模式空間的內(nèi)容寫(xiě)到文件file中。
3.???????? 命令行上3種方式書(shū)寫(xiě)多重指令
a)???????? 分號(hào)分隔方式;
例: sed 's/old1/new1/; s/old2/new2/; s/old3/new3/' filename
b)???????? 每個(gè)指令前加 -e 參數(shù);
例: sed -e 's/old1/new1/' -e 's/old2/new2/' filename
c)???????? bourne shell的分行指令功能;
單引號(hào)后RETURN,出現(xiàn)多行輸入提示符(>).????
說(shuō)明:
Csh中不能使用,Csh中每個(gè)指令結(jié)尾使用分號(hào),使用反斜杠(\)作為每一行的結(jié)束。
于Bourne shell兼容的shell,如:ksh,bash,pdks,zsh則可以使用(' " ( { \)進(jìn)行分行指令。
例1:# sed '
???? > s/old1/new1/
???? > s/old2/new2/
???? > s/old3/new3/' filename
轉(zhuǎn)載于:https://blog.51cto.com/horizon49/1048483
總結(jié)
- 上一篇: Python应用02 Python服务器
- 下一篇: 数组 边界 检查的几种实现方法