sed (Stream Editor) 流編輯器
sed工作模式
依次從文件中讀取一行,不編輯源文件;符合要求的行(能被模式匹配到的行)送到“模式空間 (pattern space)”執行編輯或其他操作,而後把處理過的結果輸出至標準輸出(屏幕);不符合要求的行(不能被模式所匹配到的行)也輸出至標準輸出
不管能否被“模式空間”所匹配到(除非遇到”d’命令),都會先輸出至屏幕(標準輸出)
語法:sed [OPTION]... 'script' FILE...
sed [OPTION]... 'COMMAND1[;COMMAND2]…' FILE…
sed [OPTION]... 'ADDRESS_COMMAND' FILE…
sed [OPTION]...'/PATTERN/COMMAND' FILE…
選項:
-n:靜默模式;不輸出模式空間中的(原有)內容到屏幕(標準輸出)
-i:直接修改原文件
-e {SCRIPTS|COMMAND}:指定多個sed腳本(多點編輯)或編輯命令
-f /PATH/TO/SED_SCRIPT_FILE:可以把sed的編輯命令放在一個文件當中;從指定文件中讀取編輯腳本(每行一個編輯命令)
-r:使用擴展正則表達式
sed腳本 (script)
sed腳本指的是:地址定界+編輯命令;sed腳本中,不能有引號(' ' " ")
地址定界 (ADDRESS)
- 不給地址(空地址):對全文(每一行)進行處理
- 單地址
10
10,- 地址範圍
開始行,結束行(1,100)
$:最後一行
n!:除了第n行外的所有行
'^$:空行
開始行,+結束行(10,+2)
從開始行開始,向後的2行- 模式
/ PATTERN /:被此模式所能匹配到的每一行
/^PATTERN/:以指定模式開頭的行
開始行,/ PATTERN /:從指定的行開始到第一次被模式匹配到的行,之間的所有行
/ PATTERN 1/,/ PATTERN 2/:從第一個符合模式1的行開始,到第二個符合模式2的行結束,中間的所有行- ~:步進
顯示所有奇數行:1~2
顯示所有偶數行:2~2
正則表達式元字符:https://blog.51cto.com/zhangdaifu/1973716
sed的子命令 (COMMAND)
多個子命令(COMMAND)用分號“;”分隔
編輯命令
d:刪除符合條件的行;使用此編輯命令時需禁用’-n’選項(可以和地址定界,模式一同使用)
p:顯示符合條件(地址定界中模式空間)的行
a \TEXT:在匹配到的行後(下),追加一個或一些文本(新行);支持使用’-n’實現多行追加
i \TEXT:在匹配到的行前(上),插入一個或一些文本(新行);支持使用’-n’實現多行插入
c \ TEXT:把匹配到的行替換成此處指定的文本在追加、替換、插入的時候,可以用“\n”換行
# sed '2a# New Line' /etc/fstab
# sed '/[[:space:]]/a \ 1 \n 2' /etc/fstab
# sed '2a# New Line 1\n# New Line 2' /etc/fstab
# sed '/^[[:upper:]]/i \New' /etc/fstab
# sed '/^[[:upper:]]/c \UUID' /etc/fstab
注意:sed的地址定界和編輯命令是不可分開的
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行(下)後面;用於實現文件合併
w /PATH/TO/SOMEFILE:保存(覆蓋)模式空間匹配到的行至指定的文件中;另存爲操作
=:爲模式匹配到的行的行的前(上)面顯示行號
!:條件取反;放在模式後面編輯命令之前(地址定界!編輯命令);對地址定界取反;除了對匹配到行以外的其他行,做出編輯操作
SOMEFILE:某文件
# sed -n '/^[^#]/w /tmp/fstab.new' /etc/fstab
# sed "/^[^#]/w $(mktemp /tmp/XXX)" /etc/fstab
# sed '3r /etc/issue' /etc/fstab
# sed '/^UUID/=' /etc/fstab
注意:如果想在一個處理當中,執行多條子命令,則使用“;”隔開
查找替換
語法格式:s[/地址定界]/查找條件/替換內容/[修飾符]
注意:除“/”外,sed還支持使用其他字符作爲修飾符“@”“#”“|”__
s:查找條件可以指“模式”
查找條件可以使用模式,但要替換的內容不行
y:逐個字符進行替換;和“s”不同的是,y將字符集替換成與之完全匹配的字符集(和tr命令一樣,但不支持正則表達式)
# echo "ABC" | sed 'y/ABC/abc/'
# sed 'y@UUID@uuid@' /etc/fstab
修飾符(替換標記)
[N]g (global):第N處替換/行內全局替換; 默認替換一個
i (ignore-case):匹配時,忽略字符大小寫
&:引用模式匹配到的整個串
p:顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中
練習
1:刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符
# sed 's@^[[:space:]]*@@g' /boot/grub2/grub.cfg
2:刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#後面的所有空白字符
# sed 's@^#[[:space:]]*@@g' /etc/fstab
3:輸出一個絕對路徑給sed命令,取出其目錄,其行爲類似於dirname
# echo /home/zhangdaifu | sed 's@[^/]+/\?$@@'
# echo /home/zhangdaifu/ | sed -r 's@[^/]+/?$@@'
sed命令示例
大部分以/etc/fstab文件爲例
顯示文件中所有內容
sed '' FILE
sed -n 'p' FILE將文件複製一份
sed 'w /tmp/fstab' /etc/fstab
不顯示以“/”開頭的行
sed '/^\//d' /etc/fstab
不顯示以“#”開頭的行
sed '/^#/d' FILE
sed -n '/^[^#]/p' FILE
sed -n '/^#/!p' FILE顯示從第2行到第1個以“#”開頭的行
sed '2,/^#/d' /etc/fstab
在所有以“#”開頭的行後,追加一句話
sed '/^#/a \Hello' /etc/fstab
在所有以大寫字母開頭的行後,追加一句話
sed '/^[[:upper:]]/a \new_line' /etc/fstab
在UUID開頭的行後插入/etc/issue文件中的內容
sed '/^UUID/r/\/etc/issue' /etc/fstab
將“#”開頭的行保存到/tmp/test文件中
sed -n '/^#/w /tmp/test' /etc/fstab
顯示以“#”開頭的行,並顯示行號
sed '/^#/=' /etc/fstab
將#開頭的行刪除
sed '/^#/d' /etc/fstab
將#開頭的行的#和空白行刪除
sed -e 's/^#//' -e '/^$/d' /etc/fstab
將文件中除了#開頭的行,其餘全部刪除
sed '/^#/!d' /etc/fstab
將文件中所有行的行首都加入#號
sed 's/^/#/' /etc/fstab
給UUID所在行的UUID字符串加上雙引號
sed 's/UUID/"&"/g' /etc/fstab
給UUID所在行加上雙引號
sed -n 's@UUID.*@"&"@p' /etc/fstab
刪除UUID所在行
sed -e 's/^#[[:space:]]*//' -e '/^UUID/d' /etc/fstab
高級編輯命令
sed的保持空間
sed的所有編輯操作都在“模式空間”中進行編輯操作,編輯完之後如果還沒有編輯結束,可以將數據放置“操持空間 (HOLD SPACE)”中,而後再處理下一行,處理完之後可以把“操持空間”當中的數據拿回再次進行處理
模式空間 == 車間
操持空間 == 倉庫
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出數據追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
n:覆蓋讀取匹配到的行的下一行至模式空間中
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行
D:刪除多行模式空間中的所有行
sed調用shell變量
sed “$變量”
# sed "s@\/bin\/sh@$SHELL@" /etc/shells
sed高級用法
顯示奇數行
# sed 'n;d' FILE
# sed -n '1~2p' FILE顯示偶數行
# sed -n 'n;p' FILE
# sed '1~2d' FILE刪除最後一行
# sed -n 'N;p' FILE
取出最後一行
# sed '$!d' FILE
# sed -n '$p' FILE取出最後兩行
# sed '$!N;$!D' FILE
顯示包含數字的行
# sed 'N;s/\n/\t/' FILE
在原有的每行後方添加一個空白行
# sed 'G' FILE
刪除原有的所有空白行,而後爲所有的非空白行後添加一個空白行(將多個空白行合併爲一個,然後在每行後方添加一個空白行)
# sed '/^$/d;G' FILE
除了第一行:# sed '1!G' FILEsed可以模擬一些命令
取出文件頭五行(相當於head -5)
# sed '5 q' FILE
把文件創建一個副本(相當於cp命令)
# sed -n 'w /PATH/TO/NEW_FILE' FILE
統計文件中的行數(相當於wc -l)
# sed -n '$ =' FILE
逆向顯示文件內容(相當於tac)
# sed '1!G;h;$!d' FILE
# sed -n '1!G;h;$p' FILE
更多:https://www.yiibai.com/sed/sed_useful_recipes.html
-------------------------------------------------------------------The End-----------------------------------------------------------------
--------------------------------------------------------------------Thank-------------------------------------------------------------------
------------------------------------------------------------------ by: ZDF -----------------------------------------------------------------
blog:http://zhangdaifu.blog.51cto.com