基本的sed指令
sed指令集合由25個指令組成,本文檔我們介紹4個新的編輯指令:d删除 a追加 i插入 c更改。還要整一下改變腳本中流程控制(例如:決定下一步執行哪個指令)的方式。
sed指令的兩點文法:
行位址對于任何指令都是可選的。它可以是一個模式,被描述為由斜杠、行号或者行尋址符合包覆的正規表達式。大多數的sed指令能接受由逗号分隔的兩個位址,這兩個位址,這兩個位址用來辨別行的範圍。這些指令的文法格式為:
[address]command
有一些指令隻接受單個行位址。它們不能應用于某個範圍的行,它的文法格式為:
[line-address]command
記住指令還可以用大括号進行分組以使其作用于同一位址:
address
{
command1
command2
command3
}
注意:第一個指令可以和大括号放置在一行,但是右大括号必須自己單獨處于一行。每個指令都可以有自己的位址并允許有多層分組。而且,就像指令在大括号内的縮進方式一樣,允許在行的開始處插入空格和制表符。
1、當sed不了解一個指令時,它列印出消息“Command garbled”(指令不清)。在指令後添加空格會産生一個小的文法錯誤,這個是不允許的,指令的結束必須在行的結尾處。2、如果指令之間用一個分号分割,那麼可以将多個sed指令放在同一行。下面的示例在語句構成上是正确的。n;d,然而,在n指令後面放置一個空格會導緻文法錯誤。而在d指令前面放置一個空格是可以的。3、不提倡在同一行上放置多個指令,因為即使将這些指令寫在各自的行上,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
當正規表達式比對單詞的變化時,“與”符号特别有用。它允許指定一個可變的替換字元串,該字元串相當于比對的内容與實際内容比對的字元串。
本文轉自 妙曼 51CTO部落格,原文連結:http://blog.51cto.com/yanruohan/1908940,如需轉載請自行聯系原作者