Linux基礎 ------- 文字處理利器sed
阿新 • • 發佈:2018-10-31
Linux文字處理利器 -- sed
Sed是UNIX/Linux系統上提供的將編輯工具自動化的編輯器,可以直接編輯檔案。Sed以行為編輯
單位(行編輯器)。相比vim,gedit等編輯工具,Sed編輯檔案只需要一條命名就可以解決很多的
問題,而且Sed對正則表示式的支援也非常好,的確是Linux下文字處理的利器。
1 使用方法
1) sed OPTIONS... [SCRIPT] [INPUTFILE...]--- ------------ -------------------
| | |--------------被修改的檔案,如果沒有定義則結果會輸出到標準輸出中
| |-------------------------------------動作,定義sed具體的操作,通常為''或者""中的字串
|----------------------------------------------sed命令選項
2 常用引數說明(OPTIONS)
-e script | --expression= script : 加入一個動作來處理,多個動作使用多個此引數
-f script-file | --file=script-file : 使用檔案中的sed動作
-i[SUFFIX] | --in-place[=SUFFIX]
-r | --regexp-extended : 使用擴充套件的正則表示式
3 如何寫一個sed的動作(SCRIPT) -- ★重要★
如何寫一個sed動作,簡單來講就是①定位 --> 在文字中選到某行或者某幾行作為操作的範圍
②操作 --> 對上述選中的行進行操作(輸出、新增、刪除、修改)
③結果 --> 對上述操作的結果進行處理(輸出到螢幕、直接修改檔案)
3.1 如何選中行
first~step : 每step行中的第first行 ----> sed -n '1~2p' 每兩行中的第一行,即奇數行
$ : 最後一行
/regexp/ : 匹配此正則表示式的行 ----> sed -n '/Ruby/p' 匹配所有含有Ruby欄位的行
addr1,+N : addr1行和其後N行內容,'+'可以省略 ----> sed -n '2,5p' 指定2到5行
addr1,~N : addr1行和其後N的倍數行內容
3.2 如何進行操作 -- sed動作說明
[n1[,n2]] functionfunction如以下的引數
a : 新增 -- 選中行之後
c : 替換
d : 刪除
i : 插入 -- 選中行之前
p : 列印
s : 替換,通常搭配正則表示式 --> 5,10s/old/new/g
3.3 關於sed的其他方面
1) 如何在sed中使用shell的變數sed動作字串使用雙引號即可
如 :
var="insert a line"
sed "1a $var"
2) sed的結果傳遞給shell
var=`cat /etc/passwd | sed -n '2,5p'`
4 一些例子
1) 新增
sed -i '1a insert a line' test -- test檔案第一行後新增sed -i '/test/a insert a line' tes -- test檔案中含有test欄位的行後面增加一行
2)刪除
sed -i '2,5d' test -- 刪除test檔案的2到5行內容sed -i '/test/d' test -- 刪除test檔案中含有test欄位的行
3)替換 ★重要★
命令格式 : sed 's/要被替換的字串/新字串/g'sed -i 's/test/this is a replace/g' test -- 將test檔案中test欄位替換成成新的欄位 (替換字串)
cat /etc/man.config | grep "MAN" | sed 's/^#.*$//g' -- 刪除所以以#號開頭的註釋行 (刪掉整行)
cat /etc/man.config | grep "MAN" | sed 's/^$//g' -- 刪掉空白行
捕獲
sed -i 's/^test/&this is a new/' test -- 在test字串後新增字串(&代表所有捕獲的字串)
sed -i 's/^test\(.*\)$/\1this is a new/' test -- 將test替換成this is a new '\1'代表'\(\)'括號裡面捕獲的字串,這裡的括號需要轉義
4)命令組合,使用shell命令
sed -i -e "s/^\(DEVICE=\).*$/\1eth1/g" -e "s/^\(HWADDR=\).*$/\1$(cat /sys/class/net/eth1/address)/g" /etc/sysconfig/network-scripts/ifcfg-eth1說明 : ①一個 -e 後接一個sed動作,多個 -e 接多個動作
②可以在sed動作中使用shell的命令 $(cat /sys/class/net/eth1/address),但是命令必須要在雙引號之間
5)檔案讀寫 r 和 w
sed '/test/r file' test --- file裡的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。sed -n '/test/w file' test --- 在test中所有包含test的行都被寫入file裡。
6) 保持和互換:h命令和x命令
sed -e '/test/h' -e '/check/x' test --- 現將含有test欄位的行儲存在緩衝區當中(h命令),再將含有check欄位行替換成緩衝區的字串(x命令)。實際作用就是交換兩行的內容。附錄:sed中的元字元(使用於正則表示式)
^ : 行開頭
$ : 行結束
. : 任意非換行字元
* : 零個或多個字元 如/.*/
[] : 匹配一個指定範圍內的字元,如/[Ss]ed/匹配sed和Sed。
[^] : 不匹配指定範圍的字元,與[]相反
\(..\) : 捕獲組
& : 儲存搜尋字元用來替換其他字元,如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的行。