在Linux操作系統中,grep、sed、awk被稱為文本操作“三劍客”,上一期中,我們將詳細介紹grep的基本使用方法,希望能夠幫助到有需要的朋友,現在,我們繼續學習sed。
我會參考官方文檔來做翻譯理解。下面正式開始:
sed(Stream Editor) 命令,翻譯為:流編輯器。它主要用于文本替換、查找和替換,以及其他文本操作,例如插入、刪除和搜索。使用sed
,我們可以在不打開整個文件的情況下編輯文件內容。它還支持正則表達式,使其成為更強大的文本操作工具。
雖然 sed 在某些方面類似于允許腳本編輯的編輯器(例如 ed),但它通過只對輸入進行一次遍歷來工作,因此效率更高。然而,sed 真正與其他類型的編輯器區別之處在于它可以在管道中過濾文本的能力。
?GNU sed 主頁: GNU sed - GNU Project - Free Software Foundation
GNU 軟件通用幫助: Getting help with GNU software- GNU Project - Free Software Foundation
下面是關于 sed 命令的詳細介紹,包括參數、用法和示例代碼。
1.sed 命令詳解(中文)
語法
sed [選項]... {腳本(僅在沒有其他腳本時)} [輸入文件]...
參數選項
-n, --quiet, --silent抑制模式空間的自動打印-e script, --expression=script將腳本添加到要執行的命令中-f script-file, --file=script-file將腳本文件的內容添加到要執行的命令中--follow-symlinks原地處理時跟蹤符號鏈接-i[后綴], --in-place[=后綴]原地編輯文件(如果提供了后綴,則會進行備份)-c, --copy在 -i 模式下對文件進行改組時使用復制而不是重命名-b, --binary不執行任何操作;用于與 WIN32/CYGWIN/MSDOS/EMX 兼容(以二進制模式打開文件(CR+LF 不被特殊處理))-l N, --line-length=N指定 l 命令所需的行包裝長度--posix禁用所有 GNU 擴展。-r, --regexp-extended在腳本中使用擴展正則表達式。-s, --separate將文件視為單獨的文件,而不是單個連續的長流。-u, --unbuffered從輸入文件中加載少量數據,并更頻繁地刷新輸出緩沖區-z, --null-data用空字符 (NUL) 分隔行--help顯示此幫助并退出--version輸出版本信息并退出
如果沒有給出 -e
, --expression
, -f
, 或 --file
選項,則第一個非選項參數將被視為要解釋的 sed 腳本。所有剩余的 аргумент (yìrgēn) 都將被視為輸入文件名;如果沒有指定輸入文件,則讀取標準輸入。
2.sed 命令語法概要(中文)
這僅僅是 sed 命令的簡要語法概要,旨在為已經熟悉 sed 的用戶提供提醒。有關更完整的描述,請查閱其他文檔(例如 texinfo 文檔)。
零地址“命令”
Zero-address ``commands'': label? 用于 b 和 t 命令的標簽。# comment 注釋一直持續到下一個換行符(或 -e 腳本片段的末尾)。} {} 代碼塊的結束括號。
零地址或單地址命令
= 打印當前行號。
a \
文本 追加文本,其中每個嵌入的新行都以反斜杠開頭。i \
文本 插入文本,其中每個嵌入的新行都以反斜杠開頭。q [退出代碼]立即退出 sed 腳本,不再處理任何輸入,除非禁用了自動打印,否則將打印當前模式空間。退出代碼參數是 GNU 擴展。Q [退出代碼]立即退出 sed 腳本,不再處理任何輸入。這是 GNU 擴展。r 文件名 追加從 filename 讀取的文本。R 文件名 追加從 filename 讀取的一行。每次調用該命令都會從文件中讀取一行。這是 GNU 擴展。
接受地址范圍的命令
{ 開始一個命令塊(以 } 結束)。b label 跳轉到標簽;如果省略標簽,則跳轉到腳本末尾。c \
text 用文本替換選定的行,其中每個嵌入的新行都以反斜杠開頭。d 刪除模式空間。開始下一個循環。D 如果模式空間不包含換行符,則啟動一個標準的新循環,就像發出 d 命令一樣。否則,刪除模式空間中的文本直到第一個換行符,并使用結果模式空間重新啟動循環,而不讀取新的輸入行。h H 將模式空間復制/追加到保持空間。g G 將保持空間復制/追加到模式空間。l 以“視覺上明確”的形式列出當前行。l width 以“視覺上明確”的形式列出當前行,并將其按寬度字符進行拆分。這是 GNU 擴展。n N 將下一行輸入讀入/追加到模式空間。p 打印當前模式空間。P 打印當前模式空間的第一個嵌入式換行符之前的內容。s/regexp/replacement/
嘗試將 regexp 與模式空間匹配。如果匹配成功,則用 replacement 替換匹配到的部分。replacement 可以包含特殊字符 & 來引用模式空間中匹配到的部分,以及特殊轉義序列 \1 到 \9 來引用 regexp 中相應的匹配子表達式。
t label 如果自上次讀取輸入行和上次 t 或 T 命令以來,s/// 執行了成功的替換,則跳轉到標簽;如果省略標簽,則跳轉到腳本末尾。
T label如果自上次讀取輸入行和上次 t 或 T 命令以來,沒有 s/// 執行成功的替換,則跳轉到標簽;如果省略標簽,則跳轉到腳本末尾。這是 GNU 擴展。
w filename 將當前模式空間寫入 filename。W filename 將當前模式空間的第一行寫入 filename。這是 GNU 擴展。x 交換保持空間和模式空間的內容。
y/source/dest/ 將模式空間中出現在源中的字符轉換為目標中對應的字符。
3、常用選項和示例
下面是關于sed
的一些常見用法和示例代碼:
# 顯示文件的部分文本:
# 可以只查看文件的一部分,例如只打印22到29行的內容。
sed -n 22,29p testfile.txt# 顯示除某些行之外的所有行:
# 顯示除22到29行之外的所有行。
sed 22,29d testfile.txt# 顯示從第n行開始的每m行:
# 可以顯示從第2行開始的每3行內容。
sed -n '2~3p' file.txt# 刪除一行:
# 可以刪除指定行號的行。
sed Nd testfile.txt# 若要刪除文件的最后一行
sed $d testfile.txt。# 查找和替換:
# 首次替換:將文件中的“danger”替換為“safety”。
sed 's/danger/safety/' testfile.txt# 全局替換:可以完全替換文件中的所有“danger”。
sed 's/danger/safety/g' testfile.txt# 替換特定行上的字符串:
# 替換文件第4行的字符串
sed '4 s/danger/safety/' testfile.txt# 替換文件第4到9行的字符串
sed '4,9 s/danger/safety/' testfile.txt# 在匹配搜索之后或之前添加一行:
# 使用選項a,在每個模式匹配之后添加新行
sed '/danger/a "This is new line with text after match"' testfile.txt# 使用選項i,在每個模式匹配之前添加新行
sed '/danger/i "This is new line with text before match" ' testfile.txt# 運行多個sed命令:
# 如果需要執行多個sed表達式,可以使用選項-e將sed命令鏈接起來
sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt# 在編輯文件之前進行備份:
# 使用選項-i.bak,sed會在編輯文件之前創建一個備份文件,以防止意外修改導致的數據丟失
sed -i.bak -e 's/danger/safety/g' testfile.txt# 刪除以模式開頭和結尾的文件行:
# 刪除以特定字符串開始并以另一個字符串結束的行
sed -e 's/^danger.*stops$//g' testfile.txt# 附加行:
# 在每行之前添加一些內容
sed -e 's/.*/testing sed &/' testfile.txt# 刪除所有注釋行和空行
sed -e 's/#.*//;/^$/d' testfile.txt# 從/etc/passwd文件獲取所有用戶名:
# 獲取/etc/passwd文件的所有用戶名列表
sed 's/\\([^:]*\\).*/\\1/' /etc/passwd# 防止覆蓋系統鏈接:
使用-i參數時,為了避免破壞鏈接,請使用follow-symklinks選項
sed -i --follow-symlinks 's/danger/safety/g' testfile.txt
這些示例應該能幫助你更好地理解 sed 命令的用法和功能。先寫這多吧,主要還是要多練習,練習的話,用子系統Ubuntu就可以。繼續關注我,下期講講述awk命令!
?如果您覺得有些用處,歡迎在評論區留言,關注。謝謝您的閱讀!
?往期學習筆記:
Windows系統開啟Linux子系統(Ubuntu)
Linux常用命令(目錄操作命令)
Linux常用命令:文件的創建、復制、移動、查找和刪除命令
Linux常用命令:文本文件的查看與編輯
Linux常用命令:文本文件的拼接與分割
Linux常用命令:文件的權限管理
Linux常用命令:文件的下載、壓縮與解壓
Linux常用命令:常見的操作符
Linux常用命令:系統操作命令
?
?Linux文本處理三劍客:grep