【替換】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出繼續執行後面的執行
這個命令的作用在於將一個文件中的所有行並列爲一行內容。