來源:馬哥教育正則表達式
我之前的文章介紹過grep了,今天我就來講一下第二個sed,它是stream editor的縮寫。在Linux的文本文件中文本存儲都是一行,顯示時表現的多行其實都是由於有換行符的存在,例如:文本是:abc$def$ghi 顯示出來就是三行了。Sed就是一個行編輯器,它一次讀一行文本進行操做,而後根據咱們的選擇看是否同步到文本之中。還有一個叫awk的,在Linux上叫作gawk(gnu awk),它是一個文本格式化工具,咱們下一篇文章再說。編輯器
工做機制:每次讀取一行文本至「模式空間(pattern space)」中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;工具
-r: 支持擴展正則表達式;spa
-n: 靜默模式;regexp
-e script1 -e script2 -e script3:指定多腳本運行;ip
-f /path/to/script_file:從指定的文件中讀取腳本並運行;input
-i: 直接修改源文件;同步
#: 指定行;it
$: 最後一行;test
/regexp/:任何可以被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #刪除以井號開頭的行
\%regexp%:同上,只不過換做%爲regexp邊界符;
/regexp/| :匹配時忽略字符大小寫;
\%regexp%| :匹配時忽略字符大小寫;
startline,endline:
#,/regexp/:從#行開始,到第一次被/regexp/所匹配到的行結束,中間的全部行;
#,#
/regexp1/,/regexp2/:從第一次被/regexp1/匹配到的行開始,到第一次被/regexp2/匹配到的行結束,中間的全部行;
#,+|-n:從#行開始,一直到向下的n行;
first~step:指定起始行,以及步長;
d: 刪除模式空間中的行;sed ‘1,2d’ /etc/fstab
=:顯示行號;sed ‘/^#/=’ /etc/fstab #顯示以#號開頭的行的行號
a \text:附加text;sed ‘/^#/a \new line’ /etc/fstab #在以井號開頭行的後面添加new line字樣
sed ‘1a \new line\nsecond line\ntherid line’ #\n表示換行符
i \text:插入text,支持\n實現多行插入;
c \text:用text替換匹配到的行;sed ‘/5,7/c \new txt’ #五到七行都替換成一個new txt
sed ‘/^#/c \new txt’ /etc/fstab #只有井號開頭的行都替換成new txt,不僅一個
p: 打印模式空間中的行;sed ‘5,7p’ /etc/fstab #5-7行的內容顯示兩遍,使用-n才符合咱們的指望
s/regexp/replacement/:替換由regexp所匹配到的內容爲replacement;
g: 全局替換;
i: 不區分大小寫 #sed ‘s/^#//g’ /etc/fstab
w /path/to/somefile:把指定的內容另存至/path/to/somefile路徑所指定的文件中;
# sed ‘5,9w /tmp/test1.txt’ /etc/fstab #將fstab中的5-9行寫到test1.txt中
r /path/from/somefile:在文件的指定位置插入另外一個文件的全部內容,完成文件合併;
#sed ‘8r /etc/issue’ /etc/fstab #將issue的第8行以後的內容讀進來放到fstab以前
(1) 刪除/boot/grub/grub.conf文件中全部行的行首的空白字符;
sed 's/^[[:space:]]\+//' /boot/grub/grub.conf
(2) 刪除/etc/fstab文件中全部以#開頭,後跟至少一個空白字符的行的行首的#和空白字符;
sed 's/^#[[:space:]]\+//' /etc/fstab
(3) 把/etc/fstab文件的奇數行另存爲/tmp/fstab.3;
sed '1~2w /tmp/fstab.3' /etc/fstab
(4) echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;
取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@'
取路徑名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'
Sed不只有一個模式空間,還有一個保持空間,它能夠幫助sed暫時存儲一些東西以便後續的使用。
h:用模式空間中的內容覆蓋保持空間的內容;
H:把模式空間中的內容追加至保持空間中內容的後面;
g:從保持空間中取到其內容,並將其覆蓋模式空間中的內容;
G:從保持空間中取到其內容,並將其追加在模式空間中的內容的後面;
x:把保持空間和模式空間中的進行交換;
n:讀取匹配到的行的下一行至模式空間;(會覆蓋模式空間中的原有內容);
N:讀取匹配到的行的下一行至模式空間,追加在模式空間中原有內容的後面;
d:刪除模式空間中的內容;
D:刪除多行模式空間中的首行;
注意:命令功能可以使用!取反;分號可用於分隔腳本;
示例:
sed 'G' /etc/issue: 在文件中的每行後方添加空白行;
sed '$!d' /etc/fstab:保留最後一行;
sed '/^$/d;G' /etc/issue: 保證指定的文件每一行後方有且只有一個空白行;
sed 'n;d' /etc/issue:保留奇數行;
sed -n '1!G;h;$p' /etc/issue :全文倒敘顯示
sed '$!N;$!D' /etc/issue:顯示最後兩行
sed命令:
-e 'script' -e 'script'
'script;script;script' 與上一行模式相同
script
script
script
-f /path/from/script 都是第一行的做用