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

最近在項目中遇到了對配置文件做局部修改的需求,用到了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

這裏寫圖片描述

發佈了44 篇原創文章 · 獲贊 34 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章