天天看點

Linux下sed的簡單了解

grep、sed和awk是linux下的文本處理工具。尤其是sed和awk,雖然使用起來比較複雜但是卻非常實用

1.正規表達式

要想使用這三個工具,首先需要掌握正規表達式的使用,這裡簡單的用一個表格來介紹一下

行首符 ^ ^a  (以a開頭的字元) 重複 * 重複0-任意個
行尾符 $ a$  (以a結尾的字元) ? 重複0-1個
字元範圍 [] [0-9]  (0-9範圍内的字元) + 重複1-任意個
任意字元 . .  (任意字元) {n,m} 重複n個-m個

這裡隻是簡單的展示一下比較常用的幾個符号,主要是為了下面更好的了解sed和awk

2.sed

sed是一種線上編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區,接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并不會發生改變。

常用參數:

-n 隻輸入經過sed處理後的那一行,如果不添加此參數則每一行都會被輸出在螢幕上

-i  直接修改源檔案而不是僅僅輸出在螢幕上

sed的格式:

sed 參數 '指令' 要操作的檔案
sed '2a 這是新增的一行' test.txt           

其中最重要的當然就是指令這個部分了接下來我們來詳細講解一下指令這個部分

新增與删除

由于sed是以行為機關進行操作的是以我們這裡先展示一下如何新增一行或者删除一行

新增

其實這個很好了解,首先a代表新增,2代表第二行 後面的文字就是我們要新增的内容。也就是說這個指令可以讓我們在第二行的後面也就是第三行新增加我們所需要的文本内容。那如果我們需要在第二行的前面增加一行内容,也就是将原來的第二行後面的内容依次往下放一行而我們新增加的内容放在第二行該怎麼辦呢?

sed '1a 這是新增加的一行' test.txt
或者
sed '2i 這是新增加的一行' test.txt
           

這裡的i其實就是插入,其實就是在第二行的前面加入一行。

删除

如何删除指定的行呢

sed '1d' test.txt
sed '1,3d' test.txt
sed '1,$d' test.txt            

相信大家也都看出來了,這裡的d就代表删除,前面的數字依舊代表行号第一行指令的意思就是删除第一行。而第二行有兩個數字,這個其實代表的是删除第一到三行。注意這裡删除的是第一行、第二行和第三行,而不是隻删除第一行和第三行。最後一行其實很容易看出來了,$代表結束,也就是删除第一行到最後一行。

查找并列印

使用sed指令我們可以很容易的在大量的文本中查找到含有我們需要的關鍵詞的行,并且将其列印出來,我們可以進行如下操作,比如查找root

sed '/root/p' test.txt           

替換

替換可以說是sed中最最最最最實用,也是最常用的功能了。那麼替換這個功能怎麼寫呢

sed  's/root/test/'  test.txt           

在這裡出現了/  /看起來很像一個括号把我們需要的内容圈了起來。沒錯,在sed中/确實有這樣的作用,但這不是他唯一的作用。這裡我們先知道/的作用類似括号把我們需要的内容限定起來就可以了。然後就是一個孤零零的p也就是print的意思了。這樣的話sed指令如果查找到含有root的行就會将這行列印出來。你們可以嘗試一下看看是否能夠達到理想的效果(其實應該寫成"sed -n '/root/p' test.txt"想想為什麼)

這裡的s就是說明我們需要使用到替換這個功能了。接下裡就是兩個用/分開的部分,剛剛我們說過/的功能類似括号是以我們就把這裡的root和test分成兩部分來看。第一部分也就是root部分,就是被替換部分。第二部分也就是test部分,就是我們要替換成的部分。也就說這條指令的意思是我們要把每一行中的第一個root替換成test。注意這裡隻是說每行的第一個root那如果我們要把每行中所有的root都替換成test該怎麼辦呢?

sed  's/root/test/g'  test.txt           

我們需要加上g這個參數,代表全面替換即可

sed進階參數()

這個在sed裡面是很實用的東西,例如當我們隻想替換一部分内容的時候,就可以使用這個參數

sed 's/^\(#\)\([a-z]\)/\2/' test.txt           

這裡看起來比較複雜是因為括号在sed中是需要轉義才能夠使用的是以我們需要在括号前加上\轉義符。簡化一下看

sed 's/^(#)([a-z])/\2/' test.txt           

這樣就好了解多了,第一個括号就是我們需要比對的第一部分在後面使用\1表示,而第二個部分使用\2表示。是以說這行sed指令的效果就是将每一行開頭的#去除,實際上我們是将前面的兩部分替換成了第二部分的内容進而實作去除的效果的。

繼續閱讀