一、介紹
Sed是一種非交互式的流編輯器(Stream Editor),可動態編輯文件。所謂非交互式是說,sed和傳統的文本編輯器(如Vi、Emacs)不同,並非和使用者直接交互,sed處理的對象是文件的數據流,sed從文本的一個文本行或者標準輸入讀取數據,將其複製到緩衝區,然後讀取命令行或者腳本的第一個命令,對緩衝區中的數據進行操作,所以sed是不會改變源文件中的任何內容。sed的工作模式是對每一行數據,若符合指定的樣式,就執行相應的操作。
二、使用場景
- 編輯相對交互式文本而言較大的文件;
- 編輯命令太複雜,在交互式文本中難以輸入;
- 對文件掃描一片,但需要進行多個編輯函數的情況;
三、使用方式
1、可以直接在命令行使用sed命令,命令格式如下:
sed [選項] 'sed命令' 輸入文件
2、可以想shell腳本一樣,把sed命令寫入腳本,然後執行腳本
四、選項和sed命令
上述使用方式1中,sed命令可以繼續分成:定位文本行+sed編輯命令
其中,定位文本行可以直接指定行號或者根據正則表達式進行模式匹配出相應的行號
sed的常用編輯命令較多,也正是編輯命令的多樣性纔有其多種編輯功能
五、一組例子
1.命令選項 -n
第一條命令顯示temp.txt內容
第二條命令是不加-n選項的情況下打印第2行的內容,其中2是定位方式,p是編輯命令,可見實際打印了第二行和所有行
第三條命令加了-n選項,只打印第二行
2、命令選項-e
不加-e選項的時候編輯命令是不可以直接放在一起執行的,如,要打印第二個行,也要打印模式"orange"所在的行號,下述語句是錯誤的
sed -n '2p,/orange/=' temp.txt
爲了能夠掃描一片文本完成多個編輯命令可以有三種方式
方式一就是使用-e選項,完成上述功能只需要這樣輸入
sed -n -e '2p' -e '/orange/=' temp.txt
方式二,使用分號隔開命令
sed -n '2p;/orange/=' temp.txt
方式三,使用{}構成命令組
sed -n '{2p;/orange/=;}' temp.txt
3、命令選項-f
當使用sed腳本的時候,如,在上述temp.txt文本中orange所在行後加上一句,可以使用a\編輯命令
命令1是腳本append.sed的內容,腳本的第一行同shell腳本指定執行程序,第二行是sed命令,在模式orange後追加第三行語句
命令2改變腳本權限,使之可執行
命令3執行腳本,注意仍需要加上源文件temp.txt
下面給出幾個編輯命令的例子
1.編輯命令i/和c/
這兩個同追加編輯命令a/,只不過i/是在定位行之前插入,c/則把定位行給修改成給定的文本,可以直接把上述append.sed腳本中a/改成i/或c/進行實驗。
2.編輯命令刪除文本d和替換文本s命令
第2條命令刪除2~4行的內容
第3條命令把apple替換成APPLE,和第4條格式一樣,與第5條的差別是加上編輯命令g(global)之後,會對全局的模式進行匹配,不加只會匹配到每行第一個
3.編輯命令保存到文件w
sed是對緩衝區的操作,不會影響源文件,若想保存編輯的效果到文件,可以使用編輯命令w
第2條命令刪除源文件中1~4行,並保存到文件new.txt,若new.txt不存在則創建。需注意,若存在的話,則會覆蓋new.txt中原來的內容
4.編輯命令讀文件r
把add.txt文件中內容加入到模式定位行之後
5.編輯命令之變換命令y
替換命令是按字符替換所以必須相等,也就是aet部分的個數必須等於AET部分的個數,作用是分別把a換成A,e換成E,t換成T
六、sed緩衝區
sed中有兩種緩衝區:模式緩衝區和(Pattern Buffer)和保持緩衝區(Hold Buffer),前面提及的緩衝區都是模式緩衝區,而保持緩衝區是另外的一塊內存空間,更像是一個輔助的緩衝區,兩個緩衝區可以實現內容的交換。
下面的例子是兩種緩衝區的互換
命令2是一個3個編輯命令的組合語句,第一個是找到模式apple所在行,這樣在模式緩衝區就有了這一行,再用編輯命令h複製保存到保持緩衝區,第二個是找到模式orange所在的行,在模式緩衝區也有這一行(這樣就覆蓋掉之前的那一句),再用x把模式緩衝區和保持緩衝區交換,於是乎orange那一行就變成了apple模式那一行,而實際的orange那一行被複制到了保持緩衝區;接着第三句,需額外補充一點的是sed中$符號不是正則表達式中表示行尾,而是表示最後一行。這樣最後一句的意思就是定位到最後一行,並且使用編輯命令G,把保持緩衝區的內容追加上去,於是乎在最後一行的後面又出現了orange模式所在行。