1. 程式人生 > >Linux文本處理之sed

Linux文本處理之sed

left p s 而不是 備份文件 完成後 rep oca 十分 新增

Linux文本處理之sed

上一篇我介紹了文本處理grep,現在我來介紹一下文本處理三劍客的第二劍客——sed。

sed 是一個比較古老的,功能十分強大的用於文本處理的流編輯器,加上正則表達式的支持,可以進行大量的復雜的文本編輯操作。sed 本身是一個非常復雜的工具,有專門的書籍講解 sed 的具體用法,但是個人覺得沒有必要去學習它的每個細節,那樣沒有特別大的實際意義。sed是一種流編輯器,處理時,把當前處理的行存儲在臨時緩沖區中,稱為『模式空間』(pattern space),接著用sed命令處理緩沖區中的內容,處理完成後,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。

1.sed用法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

2.參數說明(選項命令)

-e<script>或--expression=<script> 以選項中指定的script來處理輸入的文本文件。

  • -f<script文件>或--file=<script文件> 以選項中指定的script文件來處理輸入的文本文件。

  • -h或--help 顯示幫助。

  • -n或--quiet或--silent 僅顯示script處理後的結果。

  • -V或--version 顯示版本信息。

  • -i.bak 備份文件並原處編輯

  • -r 可以使用擴展正則

3.動作說明(編輯命令)

  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)

  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

  • d :刪除,因為是刪除,所以 d 後面通常不接任何東西;

  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

  • p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~

  • s :取代,可以直接進行取代的工作,通常這個 s 的動作可以搭配正規表示法

  • =:為模式空間中的行打印行號

  • !:模式空間匹配行取反處理

4.地址定界

a.關於定址:

默認情況下sed會對每一行內容進行匹配、處理、輸出,某些情況不需要對處理的文本全部編輯,只需要其中的一部分,比如1-10行,偶數 行,或者是包含"hello"字符串的行,這種情況下就需要我們去定位特定的行來處理,而不是全部內容,這裏把這個定位指定的行叫做"定址"

b. 數字定址:數字定址其實就是通過數字去指定具體要操作編輯的行,如下:

[root@localhost(yuaning) ~]# cat abc.txt 
a
b
c
d
e
[root@localhost(yuaning) ~]# sed -nr '4s/d/4/p' abc.txt (指定第4行的d替換成4,-n默認不輸出,記得在正則表達式最後加上p)
4
[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[root@localhost(yuaning) ~]# sed -n '2,4s/linux/hello/p' abc.txt 
2hello
3hello
4hello   (指定第2行到第4行的字符Linux替換為hello)
[root@localhost(yuaning) ~]# sed -n '1,+2s/linux/hello/p' abc.txt 
1hello
2hello
3hello   (指定第1到1+2行的字符Linux替換為hello)
[root@localhost(yuaning) ~]# sed -n '$s/linux/hello/p' abc.txt 
5hello   ($表示最後一行)
[root@localhost(yuaning) ~]# sed -n '2!s/linux/hello/p' abc.txt 
1hello
3hello
4hello
5hello    (!表示除了指定行以外的行,記得不要寫反了)

c.正則表達式定址:正則定址使用目的和數字定址完全一樣,使用方式上有所不同,是通過正則表達式的匹配來確定需要處理編輯哪些行,其它 行就不需要額外處理,如下:

[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[root@localhost(yuaning) ~]# sed '/3linux/d' abc.txt 
1linux
2linux
4linux
5linux     (表示只把指定行刪除,其他行不變)
[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[root@localhost(yuaning) ~]# sed '/^[[:digit:]].*/d' abc.txt 

[root@localhost(yuaning) ~]# sed '/^[[:digit:]][[:lower:]]\+/d' abc.txt 

666   (用正則表達式選擇匹配的行刪除)

d.數字和正則混合使用:正則表達式和數字組合更為靈活

[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[root@localhost(yuaning) ~]# sed '4,/^$/d' abc.txt 
1linux
2linux
3linux
666       (表示刪除從第4行到空白行)

e.高級使用:讀取一個數據指令從第一個挨個執行到最後一個指令,指令用;隔開,然後進行下一個數據的循環,直到數據全部執行一次

模式空間和保持空間:模式空間初始化為空,處理完一行後會自動輸出到屏幕並清除模式空間;保持空間初始化為一個空行,也就是默

認帶一個\n,處理完後不會自動清除。模式空間和保持空間,從程序的角度去看,其實就是sed在工作的時候占用了一些內存空間和地址,

sed工作完畢就會把內存釋放並歸還給操作系統。

g:將保持空間的內容拷貝到模式空間中,原模式空間將被清零。

G:將保持空間的內容追加到模式空間\n之後。

h:將模式空間的內容拷貝到保持空間中,原保持空間將被清零。

H:將模式空間的內容追加到保持空間\n之後。

d:刪除模式空間中的所有行,並讀入下一行。

D:刪除模式空間的第一行,不讀入下一行。

x:交換內容

n:讀取匹配到的下一行覆蓋至模式空間。

N:讀取匹配到下一行追加到模式空間後。

[root@localhost(yuaning) ~]# seq 1 10 |sed -n 'n;p'   (打印偶數行)
2
4
6
8
10   (把讀取到1放到模式空間,然後n指令緊接著把下一行的2覆蓋1,然後p指令打印)
[root@localhost(yuaning) ~]# seq 1 5 |sed '1!G;h;$!d'    (倒序輸出)
5
4
3
2
1
[root@localhost(yuaning) ~]# seq 1 5 |sed -n '1!G;h;$p'
5
4
3
2
1
[root@localhost(yuaning) ~]# seq 1 5 |sed 'N;D'   (輸出最後一行)
5
[root@localhost(yuaning) ~]# seq 1 5 |sed '$!d'
5
[root@localhost(yuaning) ~]# seq 1 5 |sed '$!N;$!D'  (輸出最後兩行)
4
5
[root@localhost(yuaning) ~]# seq 1 3 |sed 'G'   (每行後面加一個空行)
1

2

3
[root@localhost(yuaning) ~]# seq 1 10 |sed 'n;d'   (輸出奇數行)
1
3
5
7
9

sed的用法很多,更多的需要在以後的工作中慢慢摸索,這裏只是一個簡單的記錄。

Linux文本處理之sed