天天看點

基本的sed指令

基本的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,如需轉載請自行聯系原作者