基本的sed命令正則表達式
sed命令集合由25個命令組成,本文檔咱們介紹4個新的編輯命令:d刪除 a追加 i插入 c更改。還要整一下改變腳本中流程控制(例如:決定下一步執行哪一個命令)的方式。ide
sed命令的兩點語法:編碼
行地址對於任何命令都是可選的。它能夠是一個模式,被描述爲由斜槓、行號或者行尋址符合括住的正則表達式。大多數的sed命令能接受由逗號分隔的兩個地址,這兩個地址,這兩個地址用來標識行的範圍。這些命令的語法格式爲:ci
[address]command文檔
有一些命令只接受單個行地址。它們不能應用於某個範圍的行,它的語法格式爲:字符串
[line-address]commandit
記住命令還能夠用大括號進行分組以使其做用於同一地址:io
addressclass
{sed
command1
command2
command3
}
注意:第一個命令能夠和大括號放置在一行,可是右大括號必須本身單獨處於一行。每一個命令均可以有本身的地址並容許有多層分組。並且,就像命令在大括號內的縮進方式同樣,容許在行的開始處插入空格和製表符。
一、當sed不理解一個命令時,它打印出消息「Command garbled」(命令不清)。在命令後添加空格會產生一個小的語法錯誤,這個是不容許的,命令的結束必須在行的結尾處。二、若是命令之間用一個分號分割,那麼能夠將多個sed命令放在同一行。下面的示例在語句構成上是正確的。n;d,然而,在n命令後面放置一個空格會致使語法錯誤。而在d命令前面放置一個空格是能夠的。三、不提倡在同一行上放置多個命令,由於即便將這些命令寫在各自的行上,sed腳本也是很難閱讀的(注意:更改、插入和追加命令必須在多行上指定,不能在同一行上指定)。
替換
n 指1到512之間的一個數字,表示對文本模式中指定模式第n次出現的狀況進行替換。
g 對模式空間的全部出現的狀況進行全局更改,而沒有g一般是一般只有第一次出現的狀況唄取代。
p 打印模式空間的內容
w 將模式空間的內容寫到文件file中。
替換命令應用於與address匹配的行。若是沒有指定地址,那麼就應用於pattern匹配的全部行。若是正則表達式做爲地址來提供,而且沒有指定模式,那麼替換命令匹配由地址匹配的內容。當替換命令是應用於同一個地址上的多個命令之一時,這將會很是有用。
和地址不一樣的是,地址須要一個做爲定界符的斜槓(/),而正則表達式能夠用任意字符來分配,只有換行符除外。所以,若是匹配的模式包含斜槓,那麼能夠選擇另外一個字符做爲定界符,例如感嘆號!。
s!/usr/mail!/usr/mail2!
注意:定界符出現了3次,並且在replacement以後是必需的。無論使用哪一種定界符,若是它出如今正則表達式中,或者在替換文本中,那麼就使用反斜槓來轉義他。
replacement是一個字符串,用來替換與正則表達式匹配的內容。在replacement部分,只用下列字符由特殊含義。
& 用正則表達式匹配的內容進行替換
\n 匹配第n個字串(n是一個數字),這個字串之前在pattern中用"\("和"\)" 指定。
\ 當在替換部分包含「與」符號(&),反斜槓(\)和替換命令的定界符時能夠用\來轉義它們。另外它用於轉義符並建立多行replacement字符串。
注意:除了正則表達式中的元字符之外,sed的替換部分也有元字符。gp表示對行進行全局替換並打印這一行。
數字表示不多使用,在這種狀況下,正則表達式在一行上重複匹配,而只須要對其中的某個位置的匹配進行替換。例如某輸入行也許包含tb1輸入,也許包含多個製表位。假設每行有3個製表符,而且要用">"來替換第二個製表位,則可使用下面的替換命令完成該功能。
s/./>/2 其中.表示一個真正的製表符。而製表符在屏幕上是不可見的,若是輸入的是一行文件,以下所示:
Column1.Column2.Column3.Column4對此文件使用以上命令後的結果以下:
Column1.Column2>Column3.Column4
注意:若是沒有數字標識,則替換命令只替換第一個製表符(所以1能夠被看做是默認的數字標誌)
替換元字符
替換元字符是反斜槓(\),「與」符號(&)和\n。反斜槓通常用於轉義其餘的元字符,可是他在替換字符串中也用於包含換行符。
舉例1:咱們能夠對前面的示例作一些改動,用換行符取代每行上的第二個製表符。
s/./\
/2
注意:在反斜槓後面不容許有空格,這個腳本產生以下的結果:
Column1.Column2
Column3.Column4
舉例2:另外一個示例來自於將troff文件轉換成Ventura Publisher 的ASCII輸入格式。它將下面的troff行:
.Ah "Major Heading"
轉換成相似的Ventura Publisher 行:
@A HEAD = Major Heading
這個問題重的難點是這一行須要先後都有空行。這是一個編碼多行替換字符串的問題。
/^\.Ah/{
s/\.Ah */\
\
@A HEAD = /
s/"//g
s/$/\
/
}
第一個替換命令用兩個換行符和'@A HEAD = ' 取代 ".Ah" ,在行結尾處有必要用反斜槓轉義換行符。在第二個替換刪除了引號。最後一個命令匹配模式空間中的行的結尾,並在他後面添加一個換行符。
以下例子:反斜槓用來轉義「與」符號。他做爲普通字符出如今替換部分。
s/ORA/0' Reilly \& Associates, inc./g
注意:若是在替換部分沒有對「與」字符進行轉義,輸出的結果將變爲:
0' Reilly ORA Associates, inc.
做爲元字符,「與」符號(&)表示模式匹配的範圍,不是被匹配的行。可使用與符號匹配一個單詞而且用troff請求來包圍它。下面的舉例用點數請求包圍一個單詞:
s/UNIX/\\s-2&\\s0/g
由於反斜槓也是替換字符串中的元字符,因此須要使用兩個反斜槓來輸出一個反斜槓,替換字符串中的「&」來表示"UNIX"。若是輸入行爲:
on the UNIX Operation System
那麼替換命令將產生:
on the \s-2UNIX\s0 Operation System
當正則表達式匹配單詞的變化時,「與」符號特別有用。它容許指定一個可變的替換字符串,該字符串至關於匹配的內容與實際內容匹配的字符串。