sed

    sed是一個流編輯器,通過多種類型轉換來修改流經它的的文本。sed不會改變提供給它的源文件,而是把改變後的結果發送到stdout.

     sed中每次處理一行。

      sed的元字符有
    .*
[]
^${}/+?|()
     元字符用法:
    除^外,其他符號在
[]
內如果要匹配自己本身字符要加/,否則是元字符的意義。^在[]內開頭表示否定,在[]內的其他地方表示本身字符。

     ^ 還可用於匹配一行的開頭;$用於匹配一行的結尾。

/^The/      匹配以“The”開頭的行

/end.$/     匹配以“end.”結尾的行

/^T.*/.$/   匹配以“T”開頭以“.”結尾的行

     /dog/匹配所有出現的“dog”

     /t.m/匹配所有先出現t,然後隔一個字符再出現m的字符,如tim,tom等。

   /(<expresion>

   /(<expresion>

/) 括號的分組用法
    /
{1,4/}
 限制次數的用法
    *   前面的字符
0
個或多個
    /+  前面的字符1
個或多個
    &
   在替換域中使用表示整個匹配部分,如s/hat/"&"/,&表示前面兩個/之間部分

[[:alpha:]]匹配任意字母字符,大寫或小寫
[[:alnum:]]匹配任意字母數字字符,相當於[0-9A-Za-z]
[[:blank:]]匹配空格或製表字符
[[:digit:]]匹配數字,相當於[0-9]
[[:lower:]]相當於[a-z]
[[:upper:]]相當於[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配標點符號
[[:space:]]匹配任意空白字符,包括空格、製表符、NL、FF、VT、CR
sed一些常用選項:
-n  抑制自動輸出(用命令p,P輸出)
-i  直接修改文件內容

        sed的執行流程:
a)開始時,把第一行讀入模式空間。
b)把命令逐一應用到模式空間,如果沒有其他控制干預,則所有命令執行完後就會到達腳本尾部,這時輸出模式空間的內容,然後清除模式空間。
c)讀入下一行(永遠記住當前行是模式空間中行號最大的那行,特別是用到N命令和控制流程改變時往往很容易搞錯下一行是什麼),重複b)過程。
上面說的“其他控制干預”包括標號的跳轉,D命令。D命令刪除模式空間中的第一個/n之前(包括這個/n)的所有內容,保留第一個/n之後的內容,然後返回腳本開始處。(有些死循環導致不能到達腳本最後,死循環中又沒有用p,P命令,這時有內容輸出是由於一些命令有立刻輸出模式空間的功能(如n輸出模式空間的內容然後讀入下一行而不用返回腳本頂端)。最好還是不要依賴sed的自動輸出了,自己顯式p吧)

    典型的sed命令行選項:

    替換(s)

替換指令格式如下:sed [address1[,address2]] s/pattern/replacement/[n|g] filename

標誌g表示對文本全部行進行操作;標誌n表示將要替換第n次 出現的表達式。

sed 's/this/that/' file.txt  把輸入文件中每一行第一次出現的this替換爲that.  與下句效果等同:

sed 's/this/that/1' file.txt

如果要把第二次出現的this替換爲that,把n設置爲2即可。


    sed 's/is/IS/g' file.txt      整個文件中出現的每個is都被IS取代

            5s/this/that/           把第五行的this 替換爲that,僅對第五行進行這個操作。 

            1,5s/this/that/       1,5表示從第一行到第五行,把第一行到第五行的this 替換爲that,僅對第五行進行這個操作。

            5,$s/this/that/          $ 把最後五行的this 替換爲that

           5,$s/this/that/         !不要對給出的行進行操作, 即不要對最後五行的this 替換爲that

     也可以指定樣式的範圍,而不僅是行數的範圍,如:

     sed '/^The/s/this/that/'     把所有以The開頭的行進行替換。

     sed '/start/,/end/s/index/idx/g'   對從包含start的行到包含end的行之間所有行進行替換操作。

刪除d

sed '1,5d' file.txt    刪除文件的前5行

應用來反轉約束條件:

sed '1,5!d' file.txt 刪除前5行之外的所有行

打印(p

打印可視爲刪除的逆操作。但有一個不同,必須指明-n標誌,以免向輸出端重複打印。

sed -n '1,5p' file.txt 打印前5行

sed -n '/^:/p' file.txt  打印以冒號開頭的行


      行的添加(a)、插入(i)、改變(c)      //注意,改變的是整個新行

sed '/start/a/ ' file.txt 在包含start的行後插入一個空白行

  sed '$i/ ' file.txt             在文件的末尾插入一個空白行

sed '/secret/c/DELETED' file.txt  查找單詞secret,然後把包含它的整行替換爲DELETED。

可以使用{}把多個指令編成一個指令組加以執行。

下面這段腳本 在匹配到關鍵字的行之前插入一個start行,之後播放一個sed行,然後把這一行本身替換成DELETED。

sed '/secret/{

i/

--start

a/

--end

c/

DELETED

}' file.txt

退出(q)


退出即結束sed編輯階段。

sed '10q' file.txt  p  這個命令發送文件的前10行,完成第10行後,就結束sed編輯階段。

這個命令可以完成GNU/Linux 中head命令的功能。

   

 

輪換(y)

y指令可以轉換文本,可以把一個字符轉換爲另一個。要提供兩個字符集合,第一個是查找集合,第二個是替換集合。

例如下面示例,如果遇到A,就把它替換爲a,以此類推。這個示例把所有大寫字母轉換成小寫字母。

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt

進行轉換時,樣式和替換字符按照一一對應的關係進行處理,因些,這兩個字符串的長度必須相等。

行數(=)

=用於發送當前的行數。可用於發送匹配給定的查找字符串的行數,或是發送輸入文件的行數。

例如,如果想知道哪些行包含了指定的查找樣式 ,可用以下腳本:

sed -n '/This/=' file.txt          這個腳本 會發送包含單詞This的那些行的行數,即每行的行號。

保持樣式 空間(h)

在sed中,有很多空間(緩衝器),sed命令就在其中進行操作。每一輸入行都首先複製到樣式空間。樣式空間是由sed臨時擁有的空間,供sed命令執行。在對樣式 空間完成腳本所指定的工作後,這一行就會被 複製輸出。

在sed中還有保留空間,可以把樣式 空間中的內容 複製到保留空間,然後在晚些時候取回他們。保留空間只是一個臨時緩衝器,但在要記錄某些行進可能非常有用。

使用保留緩衝器,可以把樣式空間中的內容存儲到保留緩衝器中,然後直接對樣式緩衝器進行操作。下面這個示例演示了發送改變後的和未改變的行。

#表示對sed腳本 的註釋,#後的字符都會識別爲註釋。

sed '{

#store the pattern space to the hold buffer

h

#perform the substitution on the pattern space

s/is/IS/

# append the unaltered line to the pattern sapce

G

}' file.txt

這個腳本發送改變後的行,然後立即發送未改動的行。

一些有用的sed單行程序:

#Emit the first 10 lines of a file(such as 'head')

sed 10q file.txt

#Emit a double-spaced version of the file

sed 'G' file.txt

#Emit number of lines in input file

sed -n '$=' file.txt

#Emit the last line of a file

sed '$!d' file.txt

#Emit all lines greater than 30 characters in length

sed -n '/^./{30/}/p' file.txt

#Emit all non-blank lines

sed '/^$/d' file.txt

#Remove all blank lines at the top of a file

sed '/./,$!d' file.txt


附加:

從shell向sed傳值
要從命令行中向s e d傳值,值得注意的是用雙引號,否則功能不執行。
REPLACE="GO"; sed "s/go/$REPLACE/g" quote.txt

下面是一些一行命令集。([ ]表示空格, [ ]表示t a b鍵)

s / \ . $ / / g’ 刪除以句點結尾行
s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
s / ^ [ ] [ ] * / / g’ 刪除行首空格
s / \ . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
s / ^ . / / g’ 刪除第一個字符
s /CO L \ ( . . . \ ) / / g’ 刪除緊跟C O L的後三個字母
s / ^ \ / / / g’ 從路徑中刪除第一個\
s / [ ] / [ ] / / g’ 刪除所有空格並用t a b鍵替代
S / ^ [ ] / / g’ 刪除行首所有t a b鍵
s / [ ] * / / g’ 刪除所有t a b鍵

在這個特別的規則表達式中,出現了 '[[:space:]]' 字符類。這只是一個特殊的關鍵字,它告訴 sed 與 TAB 或空格匹配。如果願意的話,可以不輸入 '[[:space:]]',而輸入 '[',然後是空格字母,然後是 Ctrl-V,然後再輸入製表鍵字母和 ']' -- Control-V 告訴 bash 要插入“真正”的製表鍵,而不是執行命令擴展。使用 '[[:space:]]' 命令類(特別是在腳本中)會更清楚。 solaris當然還是要用/usr/xpg4/bin/sed.

關於 's///' 命令的另一個妙處是 '/' 分隔符有許多替換選項。如果正在執行字符串替換,並且規則表達式或替換字符串中有許多斜槓,則可以通過在 's' 之後指定一個不同的字符來更改分隔符。sed -e 's:/usr/local:/usr:g' mylist.txt 在該例中,使用冒號作爲分隔符。

http://www.mscto.com

更多字符匹配
'[ ]' 規則表達式語法還有一些附加選項。要指定字符範圍,只要字符不在第一個或最後一個位置,就可以使用 '-',如下所示

'[a-x]*'
這將匹配零或多個全部爲 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符類來匹配空格。以下是可用字符類的相當完整的列表

字符
類 描述
[:alnum:] 字母數字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或製表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字 [0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進制數字 [0-9 a-f A-F] http://www.mscto.com

一個地址的多個命令
有時,可能要指定應用到一個地址的多個命令。這在執行許多 's///' 以變換源文件中的字和語法時特別方便。要對一個地址執行多個命令,可在文件中輸入 sed 命令,然後使用 '{ }' 字符將這些命令分組,如下所示
1,/^END/{ s/[Ll]inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g p }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章