歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Unix文本處理工具之sed

Unix文本處理工具之sed

日期:2017/2/28 14:44:11   编辑:Linux教程

和上文提到的awk一樣(見 http://www.linuxidc.com/Linux/2013-08/89316.htm ),sed也是Unix的文本處理工具。sed是Stream Editor(流式編輯器)的縮寫,它能夠基於模式匹配過濾(所謂過濾就是在文件中找到符合某些條件的行)修改文本(就是對找到的符合條件的內容進行一些修改操作)。

1、sed命令格式

1.1 sed命令的基本格式

sed命令主要有三種使用形式:

  • sed ‘編輯指令’ 文件1 文件2 ……:用於將處理後的結果輸出
  • sed -n ‘編輯指令’ 文件1 文件2 ……:用於只輸出編輯指令影響的行
  • sed -i ‘編輯指令’ 文件1 文件2 ……:用於直接在文本文件上修改文本內容(在物理磁盤上修改文件)

1.2 編輯指令

編輯指令主要由兩部分組成:前面是逗號隔開的兩個地址(或者沒有逗號,只有一個地址),代表要處理文本的起始位置到結束位置;後面是要進行的操作類型。格式如下:

[起始地址[,結束地址]]操作類型

如果在一條sed命令中要用到多條編輯指令,那麼各個編輯指令之間要用;隔開,也可以將多條編輯指令放在多個單引號中,但是這樣的話,要在每個單引號的前面加一個-e。下面是一個簡單的例子:

$cat sed_test.txt
1 apple a,b,d,f
2 boy alsdjf,apple,kdjf
3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit/linux

$sed -n '2,5p' sed_test.txt
2 boy alsdjf,apple,kdjf
3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit/linux

$sed -n '5p' sed_test.txt
5 eat http://www.linuxidc.com/Linuxitit/linux

$sed -n -e '2p' -e'5p' sed_test.txt
2 boy alsdjf,apple,kdjf
5 eat http://www.linuxidc.com/Linuxitit/linux

1.3 操作類型

sed常用的操作類型如下:

操作 作用 p 打印文本行(print) n 取下一行(next) d 刪除(delete) s 字符串替換(substitude) a 追加新的文本(append)

2、例子

下面的例子都是對文提到的文件sed_test.txt的操作:

使用正則表達式:
(1)輸出從第一個包含kdjf的行到最後一行($代表最後一行)
$sed -n '/kdjf/,$p' sed_test.txt
2 boy alsdjf,appleapple,kdjf
3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit
(2)輸出包含單詞apple的行
(shell中單詞是指一個字符串前後有空格或其它標點符號。正則表達式中用一個<>來界定一個單詞,在sed中用該符號要進行轉義。)
$sed -n '/\<apple\>/p' sed_test.txt
1 apple a,b,d,f

刪除指定行(這裡沒有-i,不對原文件進行操作,只是將處理後的結果輸出。):
(1)刪除第2到4行
$sed '2,4d' sed_test.txt
1 apple a,b,d,f
5 eat http://www.linuxidc.com/Linuxitit
(2)刪除包含appleapple的行和最後一行($)
$sed '/appleapple/d;$d' sed_test.txt
1 apple a,b,d,f
3 cat 163.2.201.1
4 dog www.linuxidc.com
(3)刪除不包含(!表示反選,選中不符合條件的行)apple的行(這樣就只剩下了包含apple的行了)
$sed '/apple/!d' sed_test.txt
1 apple a,b,d,f
2 boy alsdjf,appleapple,kdjf

替換指定文本:
(1)將1-4行的apple換成AMAZON。s代表替換,g代表如果一行出現兩個apple則全部替換。
$sed '1,4s/apple/AMAZON/g' sed_test.txt
1 AMAZON a,b,d,f
2 boy alsdjf,AMAZONAMAZON,kdjf
3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit
(2)注釋shell腳本(在行首插入#)
$sed '1,3s/^/#/g' sed_test.txt
#1 apple a,b,d,f
#2 boy alsdjf,appleapple,kdjf
#3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit
(3)刪除字符串apple(如果不寫起始地址和結束地址,則默認為所有行。)
$sed 's/apple//g' sed_test.txt
1 a,b,d,f
2 boy alsdjf,,kdjf
3 cat 163.2.201.1
4 dog www.linuxidc.com
5 eat http://www.linuxidc.com/Linuxitit

以上兩篇文章介紹了Unix兩個文本處理工具awk和sed,希望對大家有所幫助。

Copyright © Linux教程網 All Rights Reserved