Linux處理文本檔案的工具:
grep 過濾檔案内容
sed 編輯檔案内容
awk
正規表達式Regex
正規表達式Regex
sed在處理文本時是逐行讀取檔案内容,讀到比對的行就根據指令做操作,不比對就跳過。
sed是Linux下一款功能強大的非互動流式文本編輯器,可以對文本檔案進行增、删、改、查等操作,支援按行、按字段、按正則比對文本内容,靈活友善,特别适合于大檔案的編輯。本文主要介紹sed的一些基本用法,并通過shell腳本示範sed的使用執行個體。
(1)比對單個字元的元字元
.
[abc] [a-z] [A-Z] [0-9] [a-zA-Z0-9] [^a-z]
[[:alpha:]] [[:upper:]] [[:lower:]] [[:digit:]]
(2)比對字元出現位置
^str 以...開頭
str$ 以...結尾
^$ 空行
(3)比對字元出現的次數
*
\?
\+
\{3\}
\{2,5\}
\{2,\}
sed: Stream Editor 流編輯器
行編輯器 逐行編輯
将每行内容讀入到記憶體中,在記憶體中進行處理,将結果傳回給螢幕,此段記憶體空間稱為摸索空間
預設不編寫原檔案,僅對模式空間的資料進行處理,處理結束後,将模式空間的内容顯示到螢幕
sed指令的使用格式
# sed [option] scripts file1 file2...
# sed [option] 'AddressCommand' file1 file ...
Address:表示對那些進行處理
Command:操作指令
option選項:
-n:不在顯示模式空間的内容(預設顯示)
-i:直接修改原檔案
-e:‘AddressCommand’ -e ‘AddressCommand’:同時執行多個比對操作
[root0shell ~]+ sed -e ‘/^#/d’ -e '/^5/d' /etc/fstab
-f:FILE将多個AddressCommand儲存至檔案中,每行一個AddressCommand;讀取該檔案中的操作同時執行多個操作
-r:表示使用擴充正規表達式
Address表示方法:
(1)StartLine, EndLine
1, 100
1,$
(2)lineNumber
3
(3)Startline, tn
5,+2 /root/,+2
(4)/正規表達式/
/root/
/bash$/
(5)/正規表達式1/, /正規表達式2/
第1次被Regex1比對的行升始,到第1次被Regex2比對的行中同的所有行
d删除
删除前4行
[[email protected] init.d]# sed '1,4d' nginx.sh
删除最後一行
[[email protected] init.d]# sed '$d' nginx.sh
删除#開頭的行
[[email protected] ~]# sed '/^#/d' /etc/fstab
删除/開頭的行
[[email protected] ~]# sed '/^\//d' /etc/fstab
删除帶數字的行
[[email protected] ~]# sed '/[0-9]/d' /etc/fstab
p 顯示符合條件的行
顯示以/開頭的行
[[email protected] ~]# sed -n '/^\//p' /etc/fstab
a \string 在符合條件的行後追加新行,string為追加的内容
在以/開頭的行後面追加# hello word
[[email protected] ~]# sed '/^\//a\# hello word' /etc/fstab
在以/開頭的行後面分别追加# hello word # hello linux
[[email protected] ~]# sed '/^\//a\# hello word' /etc/fstab
i \string 在符合條件的行前追加新行,string為追加的内容
在檔案的第一行追加 # hello linux
[[email protected] ~]# sed '1i \# hello linux' /etc/fstab
c \string 替換指定的内容
将檔案中最後一行的内容替換為 end of file
[[email protected] ~]# sed '$c\end of file' /etc/fstab
= 用于顯示每一行的行号
顯示/etc/passwd檔案最後一行的行号
[[email protected] ~]# sed -n '$=' /etc/passwd
r file_name 将指定的檔案的内容添加到符合條件的後面
将檔案的第二行後面追加/etc/fstab
[[email protected] ~]# sed '2r /etc/issue' /etc/fstab
w file_name 将符合條件的内容另存到指定的檔案中
将以#開頭的行另存到/1.txt中
[[email protected] ~]# sed '/^#/w /root/1.txt' /etc/fstab
查找并替換
預設情況下,隻替換每一行第一次出現的字元
s /old/new/[修飾符]
old:正規表達式/
new:替換的内容
修飾符
g:替換第一行所有的字元
i:忽略大小寫
查找檔案的UUID,并替換成uuid
[[email protected] ~]# sed 's/UUID/uuid/' /etc/fstab
将行首的/替換成#
[[email protected] ~]# sed 's/^\//#/' /etc/fstab
[[email protected] ~]# sed 's|/|#|g' /etc/fstab
将每一行出現的所有/替換成@
[[email protected] ~]# sed 's/\//@/g' /etc/fstab