我最愛的流編輯器sed用法總結

【替換】s

1
sed'/mislost/long/g' filename

sed中,文件的每一行都會作爲輸入傳入到sed中,如果不加g那麼上述列子中只會替換每一行


第一個匹配到的mislost。加g則會匹配一行中所有的mislost

 

想要定位一個行,然後去匹配需要這樣做

1
sed'/test/s/mislost/long/g' filename

如果這一行包含有test,則將mislost替換爲long

在例子中,/test/ 就是一個地址,sed在做操作的時候可以指定0個,1個或者2個地址。每個地

1
sed'/test/s/mislost/long/g' filename

址都是一個描述模式。

·如果沒有指定地址,那麼命令將應用於每一行。

·如果只有一個地址,那麼命令應用於這個地址匹配的任意行。

·如果指定了由逗號分隔的兩個地址,那麼命令應用於匹配第一個地址的第一行和它後面的行,直到匹配到第二個地址的行(包括此行)

·如果地址後面根由感嘆號(!),那麼命令就應用於不匹配該地址的所有行。

 

來看一個有趣的例子:

1
sed s'/^$/.Mis'

它用.Mis來取代每一個空行。在替換命令的部分(.Mis)不必轉義字面的句點,所以我可以直接用.而不需要用\.來轉義它。


一個在替換中列出不想被替換的對象

1
sed '/---/!s/--/lost/'

上面的例子只會將--替換爲lost 而不會將---替換爲lost-



【刪除】d

1
2
sed 'd'   它將刪除所有的行
sed '1d'  它將只刪除第一行


有一個相當重要的概念:

1
sed '1d' file1 file2  它將只刪除file1的第一行,不會刪除file2的第一行

·在sed中,行號指由sed維護的內部行數。該計數器不會因爲有多個輸入文件而重置。因此,不管指定了多少個輸入文件,在輸入流中也只有一行1。同樣,輸入流也只有一個最後的行,可以用$來表示最後一行。

 

重要:正則表達式必須封閉在斜槓中

1
2
3
/^$/d     只刪除空行
^$d        這樣的使用方法則是錯誤的
$!d         這樣表示除了最後一行,都刪除掉

 

如果提供兩個地址,那麼久指定了命令執行的行範圍。比如:

1
/^mislost/,/^long/d      刪除以mislost開頭的到以long開頭的左右行

 

有一個很有用的混合使用行地址和模式地址的列子:

1
1,/^$/d

刪除了從第一行一直到第一個空行的所有行,可以用來刪除某些文件的頭文件

清注意,如果文件中沒有空行,將刪除所有的行!


正常的刪除,sed會將匹配到的行整個刪除,如果我們想要只刪除行中匹配的部分,可以用替換命令並指定一個空得替換,比如:

aabbccdd 想要刪除bb 最後的結果爲 aaccdd

1
sed 's/bb//'

 

【提取內容】

來看兩個簡單的提取例子:

1
2
sed -n '/^root/,'/^mislost/p'
sed -n '/^root/p;/^mislost/p'

第一個是提取“以root開頭的行到以mislost開頭的行之間的所有內容”。

第二個是提取“以root開頭的行和以mislost開頭的行”


【插入、追加和更改】a    i    c

1
sed '/^a/i\mislost' 插入   在以a開頭的行上插入一行mislost
1
sed '/^a/a\mislost' 追加   在以a開頭的行下追加一行mislost

1
sed '/^a/c\mislost' 更改   把以a開頭的行修改爲mislost


在以a開頭的行下追加mislost

注意:追加和插入只應用於單個行地址,而不是一個範圍內的行。更改命令可以處理一個範圍內的行。

這裏的更改命令要區別於替換,替換隻是將匹配的關鍵字替換了而不是整個行,c\則修改了整個行的內容。


【列表】l

列表命令(l) 用於顯示模式空間的內容,將非打印的字符顯示爲兩個數字的ASCII碼。

cat test.txt

1
2
3
aaaa    www.baidu.com
bbbb    www.sina.com.cn
cccc    www.qq.com


sed -n -e "l" test.txt

1
2
3
aaaa\twww.baidu.com$
bbbb\twww.sina.com.cn$
cccc\twww.qq.com$


【轉換】y

1
sed 'y/abc/xyz'

y命令開啓轉換,轉換對應爲:

a=>x

b=>y

c=>z

PS:轉換命令的一個可能的用處是用大寫字母替換對應的小寫字母


【打印】p


【退出】q

退出命令會使sed停止讀取新的輸入行(並停止將它們發送到輸出)。


1
sed '/50q/'

打印每一行,直到第50行,並且退出,類似於Unix中的head命令。

同樣,這個命令也可以用地址範圍來實現

1
sed -n '1,50p'


【高級命令】

h或者H    將模式空間的內容複製或者追加到保持空間

g或者G    將保持空間的內容複製或者追加到模式空間

x              交換保持空間和模式空間的內容

【標籤】

表示前是任意不多餘7個字符的序列。標籤佔據一行並以冒號開始。

一個有趣的例子

1
sed ':a;N;s/\n//;$!ba'

解析:

:a定義一個標籤a

N將下一行的內容添加到當前讀入行,並在末尾加一個\n

s/\n//將新行中的\n刪掉

$!ba如果讀入行不是最後一行就跳轉到標籤a出繼續執行後面的執行

這個命令的作用在於將一個文件中的所有行並列爲一行內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章