Linux 文本查看命令之sed
默認不直接編輯原文件,在內存中進行處理(但是會整篇處理),臨時存放的空間叫做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