歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux文本處理工具之sed

Linux文本處理工具之sed

日期:2017/2/28 14:24:05   编辑:Linux教程

概念:
sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩存區中,稱為"模式空間(pattern space)",接著用捨得命令處理緩沖區中的內容,處理完成後,把緩存區的內容輸出。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非你是用重定向存儲輸出。sed主要用來編輯一個或多個文件。
格式:
sed [-nefri] 'command' 輸入文本
常用選項:
-n:使用安靜(silent)模式。在一般sed的用法中,所有來自STDIN的資料一般都會被列出到終端上。但如果加上-n參數之後,則只有經過sed特殊處理的那一行(或者動作)才會被列出來。
-e:直接在指令列模式上進行sed的動作編輯
-f:直接將sed的動作寫在一個檔案內,-f filename則可以執行filename內的sed動作
-r:sed的動作支援的是延伸正規表示的語法(預設是幾次正規表示法的語法)
-i:直接修改讀取的檔案內容,而不是由熒幕輸出
動作說明:
[n1[,n2]] 常用命令:不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

常用命令:
a:追加,a的後面可以接字符串,而這些字符串會在新的一行出現(目前的下一行)
c:更改,c的後面可以接字符串,這些字符串可以取代n1,n2之間的行
d:刪除,d的後面不接受任何東西
i:插入,i的後面可以接字符串,而這些字符串會在新的一行出現(目前的上一行)
p:列印,講某個選擇的資料印出,通常會與參數-n一起出現
s:替換,可以直接進行替換的工作,sed 's/要替換的字符串/新的字符串/flags',這裡修飾替換的標志flags有:
g:表示在行內進行全局替換,而沒有g時通常只有第一次出現的時候被替換
n:1-512之間的一個數字,表示對本模式中指定模式第n次出現的情況進行替換

p:打印模式空間的內容

w:將模式空間的內容寫入file中

q:結束或退出sed

舉例:
1.刪除某行
a.sed '2d' file #刪除第二行
b.sed '$d' file #刪除最後一行
c.sed '1,5d' file #刪除第一行到第五行
d.sed '5,$d' file #刪除第五行到最後一行
e.sed '/My/,/You/d' file #刪除包含"My"的行到包含"You"的行之間的行
f.sed '/My/,10d' file #刪除包含"My"的行到第十行的內容
g.sed '/^$/d' file #刪除空行
2.顯示某行
a.sed -n '2p' file #顯示第二行
b.sed -n '$p' file #顯示最後一行
c.sed -n '1,5p' file #顯示第一行到第五行
d.sed -n '5,$p' file #顯示第五行到最後一行
3.模式進行查詢
a.sed -n '/sed/p' file #查詢包括關鍵字sed所在的所有行
b.sed -n '/\$/p' file #查詢包括關鍵字$所在所有行,使用"\"屏蔽特殊含義
4.增加一行或多行字符串
a.sed '1a test' file #在第一行後新增字符串"test"
b.sed '1,3a test' file #在第一行到第三行後新增字符串"test"
c.sed '1a test\ntest' file #在第一行後新增多行,使用換行符\n
5.替代一行或者多行或者一行中的某部分
a.sed '1c test' file #第一行的內容替換為test
b.sed '1,2c test' file #第一行到第二行的內容替換為test
c.sed '1,5s/a/A/' file #第一到第五中的首個a替換為A
d.sed '/B/s/a/A/g' file #將有B的行中的a替換為A
6.插入
a.sed -i '$a test' file #在最後一行直接輸入test
7.多點編輯
a.sed -e '3,$d' -e 's/Test/test' file #先刪除第三行到最後一行的數據,然後將"Test"替換為"test",$需要和正則表達式的$區分開,在此處表示行的結束
b.sed -e '3,$d; s/Test/test' file #效果同上
8.腳本
a.講以下命令保存在一個文本中(sed-script)
3i\
~~~~~~~~~~~~~~~~~~~~~
3,$s/\(hrwang\) is \(mjfan\)/\2 is \1/
$a\
We will love eachother forever!!
b. sed -f sed-script file
上邊的腳本還可以進一步的優化
a.將以下命令保持在一個sh腳本中(sed-script)
#!/bin/sed -f
3i\
~~~~~~~~~~~~~~~~~~~~~
3,$s/\(hrwang\) is \(mjfan\)/\2 is \1/
$a\
We will love eachother forever

b../sed-script file

9.退出

a. sed '/^name/q' file #在匹配到之後,sed會輸出這一行,然後再退出

b. sed '2q' file #輸出第二行之後就退出

c. sed ‘/name/{ s/name/NAME/ ;q; }’ file #在某行包含了name,把name替換成NAME,然後退出sed


注意:
1.sed -i 這個動作會直接修改到原始的文件,慎用。
2.sed -e 這個動作表示多點編輯
3.sed腳本就是寫在文件中的一系列sed命令。腳本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多個命令,要用分號分隔。執行腳本時,sed先將輸入文件中第一行復制到模式緩沖區,然後對其執行腳本中所有的命令。每一行處理完畢後,sed再復制文件中下一行到模式緩沖區,對其執行腳本中所有命令。使用sed腳本時,不再用引號來確保sed命令不被shell解釋。
4.sed命令可以指定零個、一個或兩個地址。每個地址都是一個描述模式、行號或者行尋址符號的正則表達式。如果沒有指定地址,那麼命令將應用於每一行;如果只有一個地址,那麼命令應用於與這個地址匹配的任意行;如果指定了有逗號分隔的兩個地址,那麼命令應用於匹配第一個地址的第一行和它後面的行,直到匹配第二個地址的行(包括此行),可以把第一個地址看做是啟用動作,並把第二個地址看做是禁用動作;如果地址後面跟有感歎號(!),那麼命令就應用於不匹配該地址的所有行。
行定位的使用
5.sed命令中c和s的區別(c直接更改,s替換)

在sed命令中引入shell變量 http://www.linuxidc.com/Linux/2014-03/97896.htm

Linux下Shell編程——sed命令基本用法 http://www.linuxidc.com/Linux/2013-06/85526.htm

Unix文本處理工具之sed http://www.linuxidc.com/Linux/2013-08/89315.htm

sed 高級用法 http://www.linuxidc.com/Linux/2014-09/106961.htm

sed命令詳解與示例 http://www.linuxidc.com/Linux/2014-11/109325.htm

Copyright © Linux教程網 All Rights Reserved