1. 程式人生 > >Linux 文本查看命令之sed

Linux 文本查看命令之sed

Linux 文本查看命令之sed的簡單操

Stream Editor 流編輯器 做行處理的

默認不直接編輯原文件,在內存中進行處理(但是會整篇處理),臨時存放的空間叫做pattern space(模式空間)。如果可以被關鍵字匹配,然後就進行編輯(編輯完成後,可以將新的內容放入hold space,保持空間),如果沒有被關鍵字匹配就默認輸出到標準輸出。

-n選項不輸出模式空間中的內容至屏幕,默認情況下,不論模式空間的內容是否匹配關鍵字都會輸出至屏幕。

-e script 默認只能一次處理一個腳本,-e 之後可以跟多個腳本,一個-e對應一個腳本,實現多點編輯。

-f /path/to/sed_script_file 每行一個編輯命令

-r 支持擴展正則表達式

-i 直接編輯原文件

地址定界

指定編輯範圍

空地址表示對全文進行處理

單地址 # 指定行

/pattern/ 被關鍵字匹配到的每一行

地址範圍

#,# 指定行範圍

#,+# 指定開始行,並往下#行

#,/pattern/ 指定行開始,到第一次匹配關鍵的行

/pattern1/,/pattern2/從第一次匹配關鍵字1開始,到第一次匹配關鍵字2的行

1~2 ~#表示步進,從第一行開始的奇數行

2~2 從第二行開始的偶數行


編輯命令 都是在操作 模式空間

d 刪除指定範圍內容

技術分享圖片

技術分享圖片

原文件沒有改變

刪除(不顯示)包含UUID字符串的行

技術分享圖片

註意:這兩次d的位置 一次是在''裏面,一次是在//外面

技術分享圖片

可以在外面

現在看看-n的效果

技術分享圖片

加了-n 什麽都看不到了

顯示奇數行

技術分享圖片

刪除偶數就是奇數

顯示偶數行

技術分享圖片

刪除奇數就是偶數

p:顯示模式空間中的內容

技術分享圖片

為什麽1和2出現了兩次呢?因為,sed模式會將模式空間中的內容輸出來,p的效果是將1和2輸出,所以1和2輸出了兩次,為了不讓模式空間的內容輸出,只看p的效果,可以加個-n

技術分享圖片

顯示奇數行

技術分享圖片


顯示1到3行

技術分享圖片

在指定位置增加內容

# \text

在第3行後增加指定內容

技術分享圖片

添加後的效果,和-n的效果 如果追加的內容裏有空格也不用管


在第三行增加多行內容

技術分享圖片

註意:需要在單引號中寫出需要追加的內容


在第三行追加內容,之前的第三行就變成第四行了。

技術分享圖片

使用指定內容替換指定行

c \text

技術分享圖片

數字3沒了,被This is a test字符串替換了

w將指定範圍內的內容另存為其他文檔

技術分享圖片

將非#號開頭的行輸出來

技術分享圖片

這裏可以看出,sed是支持正則表達式的,這個例子的難點就在於如何標識非#號


r將其他文件的內容追加到指定行

技術分享圖片

在第四行之後追加內容。


為指定行打印行號

技術分享圖片

先打印行號,在輸出行的內容

! 條件取反

將非#號開頭的行輸出來

技術分享圖片

第一個是非#號開頭的行,第二個是#號開頭的行,第二個命令我用了! 條件取反,而且註意這裏的!需要轉義,不然就解析為最近一次以p開頭的命令並執行

技術分享圖片


s 查找替換

這個類似於VIM編輯器的查找替換操作,分隔符可以執行指定 @ # 都可以,g表示全局替換(默認選項) w將替換後的內容另存為 ,p顯示替換成功的行

刪除文件中所有以空白字符開頭的行的行首的所有空白符

技術分享圖片

這個是原文

技術分享圖片

這個是改過之後的,默認是全局又該

技術分享圖片

這個就顯示被修改過的行


把文件中的1改為a

技術分享圖片

將指定行的1改為a

技術分享圖片

技術分享圖片

sed可以一次執行多次編輯操作

將/etc/fstab中的UUID改為uuid,再將uuid所在的行刪除

技術分享圖片

技術分享圖片

輸入一個絕對路徑給sed命令,取出其目錄,類似於dirname的命令

技術分享圖片

發現沒有t沒有了

我現在加個尾部的定位符

技術分享圖片

發現i字符沒了,所以現在要取出dirname很簡單啦

技術分享圖片

輸入一個絕對路徑的sed,取出其文件名,類似於basename的命令

技術分享圖片

這裏要取代的是一個範圍,需要用\1的方式

技術分享圖片

高級編輯命令

h 將模式空間中的內容覆蓋至保持空間中

H 將模式空間中的內容追加至保持空間中

g 將保持空間中的內容覆蓋至模式空間中

G 將保持空間中的內容追加至模式空間中

x 將模式空間中的內容與保持空間中的內容互換

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

N 讀取匹配到的行的下一行至模式空間中 追加

d 刪除模式空間中的行

D 刪除多行模式空間中的所有行

p顯示模式空間中的內容

案例一 顯示偶數行

技術分享圖片

技術分享圖片

由於沒有指定操作範圍,程序首先讀入第一行,n的效果是讓命令去讀取本行的下一行,並將內容讀入到模式空間,p的效果是將匹配的模式空間中的內容輸出。


案例二 逆序顯示文件內容

sed ‘1!G;h;$!d’ file_name

技術分享圖片

從這個例子中,重新說明了幾個問題,第一:sed 從文件中讀取的內容首先放入模式空間中,通過匹配之後再放入保持空間中 第二:sed 讀取內容是以行為單位的。第三 $符號的意思是讀取內容的最後一行。 這個命令的過程類似於漢諾塔的遊戲。


案例三 顯示最後一行

sed '$!d' filename

技術分享圖片


案例四 顯示最後兩行

sed '$!N;$!D' 顯示最後兩行

技術分享圖片

當系統讀入倒數第二行,由於倒數第二行不是倒數第一行那麽就N,讀取倒數第一行並追加。現在的模式空間中有2行,程序讀取了倒數第一行那就不刪除(!D),最後輸出到屏幕


案例五

顯示奇數行

sed 'n,d' filename

技術分享圖片

技術分享圖片


Linux 文本查看命令之sed