SED 命令或 流編輯器是 linux / Unix 系統提供的非常強大的實用程序。它主要用于文本替換,查找和替換,但也可以執行其他文本操作,例如 插入,刪除,搜索 等。使用 SED,我們可以編輯完整的文件而無需打開它。SED 還支持使用正則表達式,這使得 SED 成為更強大的測試操作工具。
基本語法如下:
sed OPTIONS… [SCRIPT] [INPUTFILE…]
(1) 顯示文件的部分文本
使用 sed,可以只查看文件的一部分,而不是查看整個文件,示例如下:
[linuxtechi@localhost ~]$ sed -n 22,29p testfile.txt
本例子,選項 n 將抑制整個文件的打印,選項 p 將只打印 22-29 行
(2) 顯示除某些行之外的所有行
使用選項 d,顯示除 22-29 行之外的所有行
[linuxtechi@localhost ~]$ sed 22,29d testfile.txt
(3) 顯示從第 n 行開始的每 m 行
顯示從第 2 行或任何其他行開始的每 3 行內容,使用以下命令
[linuxtechi@localhost ~]$ sed -n '2~3p' file.txt
(4) 刪除一行
其中 N 是行號,選項 d 將刪除提到的行號,示例如下:
[linuxtechi@localhost ~]$ sed Nd testfile.txt
若要刪除文件的最后一行,請使用如下命令:
[linuxtechi@localhost ~]$ sed $d testfile.txt
(5) 刪除一系列行
從 testfile.txt 文件中刪除 29-34 行
[linuxtechi@localhost ~]$ sed '29,34d' testfile.txt
(6) 刪除范圍以外的行
從 testfile.txt 文件中刪除 29-34 之外的行
[linuxtechi@localhost ~]$ sed '29,34!d' testfile.txt
(7) 添加空白行 / 空格
使用選項 G, 可以在每個非空行之后添加一個空行
[linuxtechi@localhost ~]$ sed G testfile.txt
(8) 查找和替換(首次替換)
使用 s 選項,將搜索 danger,并將其替換為 saftey,執行首次匹配。
[linuxtechi@localhost ~]$ sed 's/danger/safety/' testfile.txt
(9) 查找和替換(全局替換)
為了完全替換文件中的所以單詞,我們將使用帶有 s 的選項 g
[linuxtechi@localhost ~]$ sed 's/danger/safety/g' testfile.txt
(10) 替換第 n 次出現的字符串模式
還可以在第 n 次出現時替換字符串,比如只有在第二次出現時才用 danger 替換 safety,依然是首次替換模式
[linuxtechi@localhost ~]$ sed 's/danger/safety/2' testfile.txt
為了完全替換第 2 次出現的所有單詞,我們將使用帶有 s 的選項 g,完全替換模式
[linuxtechi@localhost ~]$ sed 's/danger/safety/2g' testfile.txt
(11) 替換特定行上的字符串
只替換文件第 4 行的字符串
[linuxtechi@localhost ~]$ sed '4 s/danger/safety/' testfile.txt
替換文件第 4-9 行的字符串
[linuxtechi@localhost ~]$ sed '4,9 s/danger/safety/' testfile.txt
(12) 在匹配搜索之后 / 之前添加一行
使用選項 a, 在每個模式匹配之后添加新行
[linuxtechi@localhost ~]$ sed '/danger/a "This is new line with text after match"' testfile.txt
使用選項 i, 在每個模式匹配之前添加新行
[linuxtechi@localhost ~]$ sed '/danger/i "This is new line with text before match" ' testfile.txt
(13) 用匹配的模式更改整行
使用 c 選項,當匹配時,正行都會被新內容替換,示例如下:
[linuxtechi@localhost ~]$ sed '/danger/c "This will be the new line" ' testfile.txt
到目前為止,我們只使用 sed 的簡單表達式,現在我們將討論 sed 與 regex 的一些高級用法
(14) 運行多個 sed 命令
如果需要執行多個 sed 表達式,可以使用選項 e 將 sed 命令鏈接起來
[linuxtechi@localhost ~]$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt
(15) 在編輯文件之前進行備份
編輯之前創建文件的備份副本,請使用選項 -i.bak
[linuxtechi@localhost ~]$ sed -i.bak -e 's/danger/safety/g' testfile.txt
這將創建擴展名為.bak 的文件的備份副本,你也可以使用其他擴展,例如 -i.backup
(16) 刪除以模式開頭和結尾的文件行
刪除以特定字符串開始并以另一個字符串結束的行,示例如下:
[linuxtechi@localhost ~]$ sed -e 's/^danger.*stops$//g' testfile.txt
(17) 附加行
使用 sed & regex 在每行之前添加一些內容,示例如下:
[linuxtechi@localhost ~]$ sed -e 's/.*/testing sed &/' testfile.txt
(18) 刪除所有注釋行和空行
要刪除所有注釋行,即帶有 # 和所有空行的行,使用如下命令
[linuxtechi@localhost ~]$ sed -e 's/#.*//;/^$/d' testfile.txt
只刪除注釋行,使用如下命令:
[linuxtechi@localhost ~]$ sed -e 's/#.*//' testfile.txt
(19) 從 /etc/passwd 文件獲取所有用戶名
要獲取 /etc/passwd 文件的所有用戶名列表,使用如下命令:
[linuxtechi@localhost ~]$ sed 's/([^:]*).*/1/' /etc/passwd
(20) 防止覆蓋系統鏈接
sed -i 命令已經被用來刪除系統鏈接,并只創建常規文件來代替鏈接文件。因此,為了避免這種情況并防止 sed -i 破壞鏈接,請在執行命令時使用 follow-symklinks 選項。
假設我們想在 centos 或 RHEL 服務器上禁用 SELinux
[linuxtechi@localhost ~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux