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