文本三劍客——sed(原創)
阿新 • • 發佈:2018-08-04
覆蓋 term pts replace path code 輸出 完成 The 我以前的文章介紹過grep了,今天我就來說一下第二個sed,它是stream editor的縮寫。在Linux的文本文件中文本存儲都是一行,顯示時表現的多行其實都是因為有換行符的存在,例如:文本是:abc$def$ghi 顯示出來就是三行了。Sed就是一個行編輯器,它一次讀一行文本進行操作,然後根據我們的選擇看是否同步到文本之中。還有一個叫awk的,在Linux上叫做gawk(gnu awk),它是一個文本格式化工具,我們下一篇文章再說。
工作機制:每次讀取一行文本至“模式空間(pattern space)”中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;
語法:sed [OPTION]... {script} [input-file]...
-r: 支持擴展正則表達式;
-n: 靜默模式;
-e script1 -e script2 -e script3:指定多腳本運行;
-f /path/to/script_file:從指定的文件中讀取腳本並運行;
-i: 直接修改源文件;
地址定界:
#: 指定行;
$: 最後一行;
/regexp/:任何能夠被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #刪除以井號開頭的行
\%regexp%:同上,只不過換作%為regexp邊界符;
/regexp/| :匹配時忽略字符大小寫;
\%regexp%| :匹配時忽略字符大小寫;
startline,endline:
#,/regexp/:從#行開始,到第一次被/regexp/所匹配到的行結束,中間的所有行;
#,#
/regexp1/,/regexp2/:從第一次被/regexp1/匹配到的行開始,到第一次被/regexp2/匹配到的行結束,中間的所有行;
#,+|-n:從#行開始,一直到向下的n行;
first~step:指定起始行,以及步長;
sed的編輯命令
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路徑所指定的文件中;
工作機制:每次讀取一行文本至“模式空間(pattern space)”中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;
語法:sed [OPTION]... {script} [input-file]...
-n: 靜默模式;
-e script1 -e script2 -e script3:指定多腳本運行;
-f /path/to/script_file:從指定的文件中讀取腳本並運行;
-i: 直接修改源文件;
地址定界:
#: 指定行;
$: 最後一行;
/regexp/:任何能夠被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #刪除以井號開頭的行
\%regexp%:同上,只不過換作%為regexp邊界符;
/regexp/| :匹配時忽略字符大小寫;
\%regexp%| :匹配時忽略字符大小寫;
startline,endline:
#,/regexp/:從#行開始,到第一次被/regexp/所匹配到的行結束,中間的所有行;
/regexp1/,/regexp2/:從第一次被/regexp1/匹配到的行開始,到第一次被/regexp2/匹配到的行結束,中間的所有行;
#,+|-n:從#行開始,一直到向下的n行;
first~step:指定起始行,以及步長;
sed的編輯命令
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表示換行符
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 都是第一行的作用
文本三劍客——sed(原創)