1. Sed簡介
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。以下介紹的是Gnu版本的Sed 3.02。
2. 定址
可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行爲起止的行的範圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符號($)表示最後一行。範圍可以通過數據,正則表達式或者二者結合的方式確定 。
3. Sed命令
調用sed命令有兩種形式:
*
sed [options] 'command' file(s) { conmand爲 /PATTERN/ACTION }
*
sed [options] -f scriptfile file(s)
a\
在當前行後面加入一行文本。
b lable
分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
c\
用新的文本改變本行的文本。
d
從模板塊(Pattern space)位置刪除行。
D
刪除模板塊的第一行。
i\
在當前行上面插入文本。
h
拷貝模板塊的內容到內存中的緩衝區。 (模式空間 到 保持空間)
H
追加模板塊的內容到內存中的緩衝區
g
獲得內存緩衝區的內容,並替代當前模板塊中的文本。
G
獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。
l
列表不能打印字符的清單。
n
讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N
追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
p
打印模板塊的行。
P(大寫)
打印模板塊的第一行。
q
退出Sed。
r file
從file中讀行。
t label
if分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label
錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file
寫並追加模板塊到file末尾。
W file
寫並追加模板塊的第一行到file末尾。
!
表示後面的命令對所有沒有被選定的行發生作用。
s/re/string
用string替換正則表達式re。
=
打印當前行號碼。
#
把註釋擴展到下一個換行符以前。
以下的是替換標記
*
g表示行內全面替換。
*
p表示打印行。
*
w表示把行寫入一個文件。
*
x表示互換模板塊中的文本和緩衝區中的文本。
*
y表示把一個字符翻譯爲另外的字符(但是不用於正則表達式)
4. 選項
-e command, --expression=command
允許多臺編輯。
-h, --help
打印幫助,並顯示bug列表的地址。
-n, --quiet, --silent
取消默認輸出。
-i 參數
直接在原文件上進行操作
-f, --filer=script-file
引導sed腳本文件名。
-V, --version
打印版本和版權信息。
5. 元字符集(\表示轉義)
^
錨定行的開始 如:/^sed/匹配所有以sed開頭的行。
$
錨定行的結束 如:/sed$/匹配所有以sed結尾的行。
.
匹配一個非換行符的字符 如:/s.d/匹配s後接一個任意字符,然後是d。
*
匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。
[]
匹配一個指定範圍內的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。
&
保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。
\<
錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。
\>
錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
x\{m\}
重複字符x,m次,如:/0\{5\}/匹配包含5個o的行。
x\{m,\}
重複字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。
x\{m,n\}
重複字符x,至少m次,不多於n次,如:/o\{5,10\}/匹配5--10個o的行。
6.sed程序實例
1. 給文件中每行的結尾添加一行空行;
解釋:上面講到 sed工具的使用格式 sed -[op] ' / 正則表達式/操作' file
當正則表達式爲空時 說明匹配所有行,G 表示 將保持空間的內容 追加到模式空間。
保持空間默認有空行,因此該命令爲 每行文本末添加了空行
若 -[op]爲 -i 則sed所做的 編輯 會 寫入 源文件
2. 用sed模擬tac功能
解釋:方法一 :爲除第一行 每次將保持空間內容追加進模式空間;
然後整體拷貝進保持空間;
最後一行時 打印模式空間內容。
方法二 :爲除第一行 每次將保持空間內容追加進模式空間;
然後整體拷貝進保持空間;
除最後一行 刪除模式空間內容 這時 會打印模式空間內容
注意:action並不是只有一個 可以同時按序執行多個action 需用 ‘ ; ’隔開
3. 追加匹配行到文件結尾
邏輯:將匹配行 追加進 保持空間 到最後一行時 從保持空間 追加 進模式空間
4. 行列轉化
分析:行列轉換 實質爲 將 ’\n‘ 與 ’自定義的 列分隔符 ‘相互 替換
因爲如果要轉換則模式空間中至少要有一行以上的數據,因此可以每讀入一行數據到模式空間的時候都將其追加到保持空間,當處理到最後一行的時候將模式空間與保持空間的內容交換,這時候模式空間裏面就是file的內容,然後再進行整體的將‘\n’替換成空格;
出從1到指定數字的序列,之後將序列交給sed,首先將每一行都追加到保持空間內,如果是最後一行則交換保持空間和模式空間的內容,這時候再對交換後模式空間的內容進行處理,將所有的‘\n’都替換爲‘+’,之後再交給bc計算工具處理就可以了;
:a可以看做是一個標籤,N表示不斷地讀入並且將其追加到模式空間內,ba表示跳到標籤處,也就是如果不是最後一行就不斷地讀讀讀直到最後一行也被追加進來的時候,模式空間的內容就是序列的內容,此時再進行整體的將‘\n’替換成‘+’,同樣的,將其交給bc計算出和;
6. 打印奇數行和偶數行
對於N來說是讀入下一行追加到模式空間,而n則是讀入下一行並且拷貝到模式空間,這裏拷貝就會將模式空間原來的值覆蓋掉,因此,先進行n再進行p操作打印出的就是偶數行,而先進行p操作再進行讀入拷貝打印出的就是奇數行;(輸出奇數行 時 ’p;N‘ 與 ’p;n‘ 結果一致 )