Linux文字處理命令sed基本使用示例

li27z發表於2016-10-11

最近在專案中遇到了對配置檔案做區域性修改的需求,用到了Linux下的文字操作神器sed,本篇根據酷殼網《sed 簡明教程》(http://coolshell.cn/articles/9104.html)來學習和記錄一下sed命令的基本使用。

sed-stream editor

首先來了解一下sed的常見引數:

用法: sed [-nefri] [動作]

選項:
-n : 使用安靜(silent)模式。在一般sed的用法中,所有來自STDIN的資料一般都會被列出到螢幕上。但如果加上-n引數後,則只有經過sed特殊處理的那一行(或者操作)才會被列出來。

-e : 直接在命令列模式上進行sed的動作編輯。

-f : 直接將sed的動作寫在一個檔案內,-f filename則可以執行filename內的sed動作。

-r : sed的動作支援的是擴充套件型正規表示式的語法(預設是基礎正規表示式語法)。

-i : 直接修改讀取的檔案內容,而不是由螢幕輸出。


動作說明: [n1[,n2]]function
n1, n2 :不一定會存在,一般代表“選擇進行動作的行數”,舉例來說,如果我的動作是需要在10到20行之間進行的,則“10,20[動作行為]”。

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

c :替換,c的後面可以接字串,這些字串可以替換n1,n2之間的行

d :刪除,因為是刪除,所以d後面通常不接任何引數

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

p :列印,也就是將某個選擇的資料列印出來。通常p會與引數sed -n一起執行

s :替換,可以直接進行替換的工作。通常這個s的動作可以搭配正規表示法,例如 1,20s/old/new/g 

1.用s命令替換

我們後面的操作均用以下這段文字做示例:

這裡寫圖片描述

示例1:將文字中的my都替換為your

命令:sed "s/my/your/g" test.txt

說明:s表示替換命令,/my/表示匹配my,/your/表示把匹配替換成your,/g 表示全部替換,不加/g則只會替換每行的第一個匹配



一般用法:sed "s/要被替換的字串/新的字串/g" filename

執行後,效果如下:
這裡寫圖片描述

不加/g效果如下:
這裡寫圖片描述

需要注意的是:上面的sed並沒有改變檔案的內容,只是把處理過後的內容輸出,如果需要寫回檔案,可以使用重定向,如:

sed "s/my/your/g" test.txt > new_test.txt

或者使用 -i 引數直接修改檔案內容:

sed -i "s/my/your/g" test.txt

還要注意的是:命令中我們可以用單引號或雙引號,如果使用單引號,那麼就沒辦法通過\’這樣來轉義,而在雙引號內可以用\”來轉義。

示例2:我們可以利用正規表示式來完成一些操作,正規表示式在文字的檢索和替換方面作用巨大,如:

在每一行開頭加點東西:sed 's/^/#/g' test.txt 
(^ 匹配輸入字串的開始位置)

這裡寫圖片描述

在每一行末尾加點東西:sed 's/$/.../g' test.txt
($ 匹配輸入字串的結束位置)

這裡寫圖片描述

示例3:我們還可以指定需要替換的內容,如:

將第3行的my替換為your:sed "3s/my/your/g" test.txt

這裡寫圖片描述

將第24行的my替換為your:sed "2,4s/my/your/g" test.txt

這裡寫圖片描述

將每一行的第1個小寫‘s’替換為大寫‘S’:sed 's/s/S/1' test.txt

這裡寫圖片描述

將每一行的第2個小寫‘s’替換為大寫‘S’:sed 's/s/S/2' test.txt

這裡寫圖片描述

將每一行的第3個及以後的小寫‘s’替換為大寫‘S’:sed 's/s/S/3g' test.txt

這裡寫圖片描述

示例4:我們可以使用&來當做被匹配的變數,然後在被匹配的變數左右加點東西,如下:

給文字中的‘my’的左右都分別加上左、右中括號:sed 's/my/[&]/g' test.txt   

這裡寫圖片描述

2.多個匹配和圓括號匹配

有時候我們需要一次替換多個模式,比如:

示例5:第一個模式把第一行到第三行的my替換成your,第二個則把第3行以後的This替換成了That

我們可以這樣寫:
sed '1,3s/my/your/g; 3,$s/This/That/g' test.txt

等價於

sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' test.txt
(用到了-e:在sed命令傳遞多個編輯命令式時,要用到-e)

這裡寫圖片描述

示例6:圓括號匹配即正規表示式中的分組,圓括號括起來的正規表示式所匹配的字串可以當成變數來使用,用\1、\2…來表示

命令:sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' test.txt

說明:該行命令的作用是將 This is my\ ([^,]*\),.*is\ (.*\) 替換為 \1:\2。
正規表示式(去掉了轉義字元)為This is my ([^,]*),.*is (.*),第一個匹配指匹配讀到以逗號作為開頭的地方的前面的資訊,第二個匹配是指匹配任意數量的不包含換行的字元。一個匹配為:This is my (cat), ……is (betty),\1就是cat,\2就是betty。
這裡寫圖片描述

3.sed的命令

N命令-把下一行的內容納入當成緩衝區做匹配

示例7:sed 'N;s/my/your/' test.txt

說明:本示例會把原文字中的偶數行納入奇數行一起匹配(類似於將下一行的內容合併在一起進行匹配),且沒有加/g,只匹配且替換一次
我們可以看到結果如下:
這裡寫圖片描述

i命令-插入

在第1行前插入一行(insert):sed "1 i This is my monkey, my monkey's name is wukong" test.txt

這裡寫圖片描述

a命令-追加

在最後一行後追加一行(append):sed "$ a This is my monkey, my monkey's name is wukong" test.txt

這裡寫圖片描述

運用匹配來新增文字。

匹配到/fish/後就追加一行:sed "/fish/a This is my monkey, my monkey's name is wukong" test.txt

這裡寫圖片描述

對每一行都追加一行......(因為每一行都能匹配到/my/):sed "/my/a ......" test.txt

這裡寫圖片描述

c命令-替換匹配行

將第二行的內容替換:sed "2 c This is my monkey, my monkey's name is wukong" test.txt

這裡寫圖片描述

將匹配到fish那一行的內容替換(fish為第三行):sed "/fish/c This is my monkey, my monkey's name is wukong" test.txt

這裡寫圖片描述

d命令-刪除匹配行

刪除第二行(第二行為dog):sed '2d' test.txt

這裡寫圖片描述

刪除匹配到fish的行:sed '/fish/d' test.txt

這裡寫圖片描述

刪除第2行到最後一行:sed '2,$d' test.txt

這裡寫圖片描述

p命令-列印
我們可以把p命令當作類似grep的命令。

我們來看這條命令:sed '/fish/p' test.txt

這裡寫圖片描述

它的作用是匹配fish並輸出,但是為什麼fish那行會輸出兩遍呢,這是因為sed處理時會把處理的資訊輸出,我們加上-n選項就不會了:
這裡寫圖片描述

從第一行列印到匹配fish成功的那一行:sed -n '1,/fish/p' test.txt

這裡寫圖片描述

相關文章