sed(Stream EDitor)是一款流編輯器,用來對文本進行過濾與替換操作。其原理是:通過文件或管道讀取文件內容,但是sed默認并不直接修改源文件,而是一次僅讀取文件的一行至模式空間(pattern space)根據sed指令進行編輯并輸出結果后清除模式空間,即所有的操作都是在模式空間中進行的。
語法格式
sed [option]... 'script' inputfile...
OPTIONS
-n,--quite,--silent:靜默輸出,即不輸出模式中的內容至輸出 -e script:使用多個腳本指令執行編輯 -f /PATH/TO/SCRIPT_FILE:從指定的文件中讀取編輯腳本 -r:支持在腳本中使用正則表達式 -i,--in-place:直接在文件原處執行編輯,即修改源文件
SCRIPT,地址+編輯指令
地址定界
(1) 不給地址:對全文進行處理; (2) 單地址 #:指定的行 $:文件的最后一行 /PATTERN/:被模式匹配到的每一行 (3) 地址范圍 m,n:指定m行到n行 #,+n:指定#行到#+n行 /pat1/,/pat2/:匹配到的pat1到pat2之間的行 #,/pat/:第#行到匹配到pat (4) 步進:~ 注意:如果//中正則表達式為空,則匹配最近一次正則表達式的匹配地址!
編輯命令
d:刪除 p:顯示模式空間的內容 a [\]text:在行后面追加內容,支持使用\n(換行符)實現多行追加 i [\]text:在行前面插入內容,支持使用\n(換行符)實現多行追加 c [\]text:替換行為單行或多行文本,支持使用\n(換行符) w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定文件中 r /PATH/FROM/SOMEFILE:讀取指定文件的文本流至模式空間中匹配到的行的行后 =:為模式空間中的行打印行號 !:取反條件 s/pattern/replacement/flags:替換,支持使用其他分隔符,如:s@@@, s### 替換標記(flags): #:替換行內匹配到的第#次的內容 g:行內全局替換 p:顯示替換成功的行 w /PATH/TO/SOMEFILE:將替換后的結果保存至指定文件 replacement: &:用pattern匹配到的內容進行替換 \n:在pattern中使用\(\)指定時,匹配第n個子串
示例
1、刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符;
# sed 's/^[[:space:]]\+//' /boot/grub/grub.conf
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符;
# sed 's/^#[[:space:]]\+//' /etc/fstab
3、echo一個絕對路徑給sed命令,取出其基名;進一步的,取出其目錄名;
# echo "/tmp/test/fstab" | sed 's/[^/]\+\/\?$//'
基于sed腳本文件進行文本處理
用法
sed -f SCRIPT_FILE FILE
SCRIPT_FILE
address{ command1 command2 ... } 命令使用花括號進行組合,使命令序列作用于同一個地址。另外,第一個命令可以和左花括號在同一行,但右花括號必須單獨處于一行。并且,命令后添加空格會產生錯誤。
sed的高級應用
除了存放當前輸入行緩沖區的模式空間,sed還有一個保持空間(hold space)的緩沖區。模式空間的內容可以復制到保持空間,保持空間的內容也可以復制到模式空間。
高級編輯命令
h:把模式空間中的內容覆蓋至保持空間 H:把模式空間中的內容追加至保持空間 g:從保持空間取出數據覆蓋至模式空間 G:從保持空間取出數據追加至模式空間 x:把模式空間中的內容與保持空間中的內容進行互換 n:讀取匹配到的行的下一行至模式空間 N:追加匹配到的行的下一行至模式空間 d:刪除模式空間中的行 D:刪除多行模式空間中的所有行
常用高級命令
sed -n 'n;p' FILE:顯示偶數行 sed '1!G;h;$!d' FILE:逆向顯示文件內容 sed '$!N;$!D' FILE: 取出文件后兩行; sed '$!d' FILE:取出文件最后一行; sed 'G' FILE: sed '/^$/d;G' FILE: sed 'n;d' FILE: 顯示奇數行; sed -n '1!G;h;$p' FILE: 逆向顯示文件中的每一行;
原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/58292