sed適合文件修改比較大的情況,vim或gedit適合小處修改。
sed命令支持的三種操作,即打印、刪除和替換
sed是一個流編輯器,它可以對從標準輸入流中得到的數據進行處理,然后把處理以后得到的結果輸出到標準輸出,而標準輸出通常會關聯到終端屏幕,因此處理后的結果也會顯示到屏幕上。當然,也可以把標準輸出重定向到文件,這樣處理后的結果就保存在磁盤文件中。注意,sed只會對流經它的數據流進行處理和編輯,而不會對原始文件做任何修改,這就意味著要處理的數據并不一定非要是磁盤上的文件,也可以是其他進程的數據輸出。
案例1:將HTML頁面中的email地址從jerry@zulmma.com改為emma@zulmma.com
index.html內容:
Email me!
Page created by:jerry@zulmma.com
copyright @2012 mysite!
modify_webpage.sh的內容如下:
#!/bin/bash#處理命令行的每一個文件,可以使用通配符for file in "$@"do echo "**PRocessing $file**" #保存結果到臨時文件中 sed 's/jerry@zulmma.com/emma@zulmma.com/g' "$file" > "$file.$$" if [ -f $file.$$ ] then #覆蓋原始文件mv -f "$file.$$" "$file" fidone echo " All Done."exit 0
sed命令通常有兩種調用形式:
#sed程序從管道中讀取輸入數據
$some_command | sed ‘edit commands’
#sed程序使用命令行參數讀取文件內容,而不是從標準輸入中讀取
$sed ‘edit commands’ files
案例2:使用sed編輯多個命令,有以下兩個方法:
l 使用分號連接多個編輯命令
sed ‘s/command1/command2/g;s/command3/command4/g’ files
l 使用選項-e指定多個編輯命令
sed –e ‘s/command1/command2/g’ –e ‘s/command3/command4/g’files
案例3:修飾符I或i大小寫不敏感匹配
$sed ‘s/command1/command2/gi’ files
除了這兩個修飾符以外,替換命令還接收如下修飾符:
修飾符 | 含義 |
num | 只取代第num個匹配 |
p | 如果匹配成功,打印模式空間 |
w FILENAME | 如果匹配成功,把結果寫到文件FILENAME中 |
g | 全局匹配,而不是只替換第一個匹配 |
I or i | 用大小寫不敏感的匹配 |
案例4:若干替換命令的字符中含有分隔符,需要給它轉義。
若只想要操作的行,有兩種方法:
l 正則表達式匹配的行
l 地址指定sed命令要操作的行
所謂地址就是文本文件的行號,要么是一個文件中的特定行,要么是一個范圍。如果在編輯命令中沒有指定地址,則sed命令會對每一行都執行編輯操作。
案例1:刪除或打印某一行或某范圍的所有行
#從文件中刪除一行
$cat –n /etc/passwd | sed ‘11d’ | more
#從文件中刪除一個范圍的行數據
$cat –n /etc/passwd | sed ‘3,26d’
#打印文件某行
$cat –n /etc/passwd | sed –n ‘11p’
打印文件某些行
$cat –n /etc/passwd |sed –n ‘3,26p’
#打印第3行及后面的3行數據
$cat –n /etc/passwd | sed –n ‘3,+3p’
解析:cat –n作用是在每行前面添加行號;編輯命令d是表示行;sed命令的默認行為是輸出所有的行數據,選項-n關閉這個默認行為;編輯命令p是明確告訴sed命令打印某些行;+num表示從起始行開始,后面的多少行在這個范圍內。
案例2:打印文件/etc/passwd中范圍之外的行
#使用感嘆號!對地址范圍取反
$cat –n /etc/passwd | sed –n ‘3,26!p’
解析:感嘆號!可以對某行或某范圍取反;
案例3:打印出/etc/passwd文件中所有單數行數據
#打印每一個奇數行
$cat –n /etc/passwd | sed –n ‘1~2p’
解析:使用address stepping的尋址方式。’1~2p’,1是起始地址,2p表示從上一次操作的行增加2行;
案例4:希望刪除配置文件/etc/sysctl.conf中的所有注釋行
#刪除文件/etc/sysctl.conf中的所有注釋行
$cat /etc/sysctl.conf | sed ‘/^#/d’
案例5:打印/etc/sysctl.conf文件中以數字結尾的行
#找到所有以數字結尾的行
$cat /etc/sysctl.conf | sed –n ‘/[0-9]$/p’
正則表達式可以指定字符的范圍:
集合 | 含義 |
[a-z] | 匹配一個小寫字母 |
[A-Z] | 匹配一個大寫字母 |
[a- zA-Z] | 匹配一個字母 |
[a- zA-Z0-9] | 匹配一個字母或數字 |
案例6:希望打印/etc/sysctl.conf文件中從’# Do not accept ICMP’開始,到’# Log Martian Packets’之間的內容
#使用正則表達式匹配確定要匹配的行范圍
$cat /etc/sysctl.conf | sed –n ’/^# Do notaccept ICMP/,/^# Log Martian Packets/p’
#還可以將行號與正則表達式混合使用
$cat /etc/sysctl.conf | sed –n ’17,/^# LogMartian Packets/p’
在sed命令中,正則表達式除了可以確定操作的行以外,還可以在替換命令中匹配希望被替換的字符串。
案例1:
#使用正則表達式所有的空行替換字符#
$cat /etc/sysctl.conf | sed ‘s/^$/#/’
案例2:
#在/etc/sysctl.conf文件中的所有非注釋行前都添加一個#字符進行注釋
$cat /etc/sysctl.conf | sed ‘s/^[^#].*$/#&/’
剛開始你可能會認為學習sed命令的使用會浪費很多時間,但是當你花費了一些時間真正掌握了它以后,你會發現這些時間和努力是非常值得的。sed命令是一個強大的流編輯器,它可以為我們自動執行大量枯燥繁瑣的編輯操作。執行sed命令時有一個模式空間的概念,本質上它就是一個工作緩存,sed命令每處理一行數據都會先把數據讀入這個緩存中,然后再按照順序執行所指定的編輯命令來處理這些數據。
本章的重要知識點包括:
(1)sed命令的工作原理;
(2)如何避免sed命令默認打印模式緩存;
(3)什么是正則表達式;
(4)如何使用正則表達式匹配行的開頭和結尾,如何匹配一個字符和任意個字符;
(5)如何使用sed命令替換字符串;
(6)選擇要操作行的幾種方式;
(7)如何在替換命令中使用正則表達式匹配要替換的字符串;
(8)如何在替換命令中引用正則表達式匹配到的結果。
新聞熱點
疑難解答