1. 程式人生 > >文本處理三劍客之sed

文本處理三劍客之sed

當前 入行 拷貝 簡化 ffd 位置 sed命令 終端 圖片

sed基本內容介紹

sed的概念及作用:
sed默認只處理模式空間,不處理原數據,它主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
定址
可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的範圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符號($)表示最後一行。範圍可以通過數據,正則表達式或者二者結合的方式確定 。
sed的命令格式:
sed [option] ‘command‘ filename
sed的命令格式與一般的命令稍顯不同,sed命令後還需要一條命令,我們可以將‘command’這部分理解為sed處理文本時需要的一個動作,比如打印,刪除……等。此外,sed命令是默認輸出的,即sed將文本處理之後,會默認的把處理過的文本輸出在終端上。


sed基本用法

sed的常見選項
-n : 一般情況下,sed是默認輸出,但加上-n選項之後,sed則不會將結果輸出在終端上。
-i : ,而不是輸出在終端上
-e : 允許sed同時進行多個動作
sed的選項要和命令搭配使用,sed處理文本還需要如下的動作。
sed常用動作
a : 追加,a的後面可以接字符串,而且這些字符會在本行的下一行出現 (如下圖:在第2行下追加"add hello")
技術分享圖片
i : 插入,和a的作用相似,只不過輸出的字符會出現在本行的上一行(如下圖,在第一行上面追加“hello i”)
技術分享圖片
p : 以行為單位顯示,通常p會與參數sed -n一起作用,表示只輸出sed處理的行數據。

sed在使用p命令時,我們可以有多種分割方式來輸出我們想要的結果

  • sed -n ‘#p‘ filename #表示數字,因為配合-n,所以結果輸出第#行的內容
    技術分享圖片
  • sed -n ‘#~2p‘ filename 表示從第#行開始,每隔兩行輸出一次
    技術分享圖片
  • sed -n ‘#,+np‘ filename 表示從第#行開始,以下的n行全部輸出
    技術分享圖片
  • sed -n ‘/string/p‘ file 表示輸出含有字符串string的行
    技術分享圖片
  • sed -n ‘/string1/,/string2/p‘ 表示輸出字符string1到string2的所有行
    技術分享圖片
    d : 刪除一行
    d的用法和p的用法相同,都可以用相同的表示方法進行輸出和刪除操作
    技術分享圖片

sed的進階用法

剛剛上面提到的都是sed的基本用法,接下來要說的是sed在處理文本中經常用到的很重要的用法
替換
指定替換行的內容
有時候我們僅需要對某些進行替換,可以在命令中指定行:

# 只對第3行進行替換
sed -i ‘3s/string1/string2/g‘ filename
#只對第3-6行進行替換
sed -i ‘3,6s/string1/string2/g‘ filename

多個匹配
如果要對一行進行兩個匹配,可以在命令字符串中使用;分割多個匹配項:

sed ‘1,3s/string1/string2/g; 3,$s/string3/string4/g‘ filename
#上述等同如下:
sed -e ‘1,3s/string/string2/g‘ -e ‘3,$s/string3/string4/g‘ filename

括號匹配(類似於分組與後向引用)

sed ‘s/this is \(string\)/\1/g‘ filename  

分組及後向引用

sed -r ‘s/this is (string)/\1/g‘ filename

sed高階用法

d
從模板塊(Pattern space)位置刪除行。
D
刪除模板塊的第一行
h
拷貝模板塊的內容到內存中的緩沖區。
H
追加模板塊的內容到內存中的緩沖區
g
獲得內存緩沖區的內容,並替代當前模板塊中的文本
G
獲得內存緩沖區的內容,並追加到當前模板塊文本的後面。
n
讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令
N
追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼
具體用法如下:
seq 1 8
技術分享圖片
seq 1 8 |sed -n ‘n;p‘ 輸出偶數行
技術分享圖片
seq 1 10 |sed ‘1!G;h;$!d‘ 或 seq 1 10 |sed -n ‘1!G;h;$p‘ 倒序輸出
技術分享圖片
seq 1 10 |sed ‘N;D‘ 或 seq 1 10 |sed ‘$!d‘ 只輸出最後一行
技術分享圖片
seq 1 10 |sed ‘$!N;$!D‘ 輸出倒數後兩行
技術分享圖片
seq 1 10 |sed ‘G‘ 每行後加一個空行
技術分享圖片
seq 1 10 |sed ‘g‘ 所有行變為空行
技術分享圖片
cat seq.txt |sed ‘/^$/d;G‘ 空行刪除,每行後加一個空行,即保證每行後只有一個空行``
技術分享圖片

seq 1 10 |sed ‘n;d‘ 只顯示奇數行
技術分享圖片


結語

sed能夠完美的配合正則表達式使用,功能不同凡響,所以對正則的學習是很重要的。

文本處理三劍客之sed