如何在 Linux 中使用 Sed
Sed 是一個簡單的 UNIX 程序,它不建立也不編輯檔案。它僅修改通過其輸入的數據,並在其輸出上呈現修改後的數據。在這裡,我們簡要概述了 UNIX 哲學,介紹了使用 的基礎知識sed
,並向您展示瞭如何使用該程式執行日常任務的範例。
使用 Sed 的基礎知識
sed 是一個可以讀取和修改文字資料流的程式。這意味著,與常規文字編輯器不同,sed 不會直接更改電腦中的檔案。相反,它更像是傳入資料的“過濾器”,並允許您按照您希望的方式對其進行轉換。
要開始使用 sed,首先建立一個文件,其中至少包含五行文字。確保行之間有一個“換行”字元:
sed 的一般指令類似:
sed 中最基本的功能之一是n
子指令。它的工作原理是從 sed 的輸入中讀取資料並將其放入程式的「模式空間」中。這是一個特殊的緩衝區,在 sed 對其進行任何操作之前保存任何傳入的文字:
sed 的另一個基本功能是p
子指令。與 類似n
,它讀取來自 sed 輸入的資料並將其放置在程式的模式空間中。但是,它也會將其明確列印在終端的輸出上。
使用p
子命令可能會讓初學者感到困惑,因為使用任何文字輸入運行它都會導致 sed 列印其輸出兩次。這是因為,預設情況下,sed 會自動列印其模式空間,無論是否p
存在:
若要停用這種奇怪的行為,請-n
在執行 sed 子命令之前新增該標誌:
掌握了基礎知識後,以下部分將介紹使用 sed 操作文字資料的不同方法。
1. 選擇並修剪文字流
除了列印之外,您還可以使用 sed 從資料流和文件中選擇和修剪文字。最簡單的方法是向p
子命令新增範圍值。
以下指令使用 sed 的範圍語法來列印「hello.txt」檔案中的第三行到第五行:
您也可以使用p
子命令列印文字中不相鄰的行。例如,以下內容列印“hello.txt”檔案中的第一行和第四行:
2. 從 Sed 流中刪除文本
Sed 也可以從任何傳入的文字流中刪除資料。如果您想從大文件中刪除幾行文字或清理程式的輸出以僅顯示您需要的訊息,這將很有幫助。
為此,請使用d
子命令以及要刪除的特定行或範圍:
與列印文字行類似,此d
子命令適用於多行範圍。例如,以下命令將從「hello.txt」檔案中刪除前四行:
除了符合特定行範圍之外,您還可以使用正規表示式來尋找要刪除的文字。這樣做將告訴 sed 查找包含單字“world”的任何行並將其刪除:
您也可以將正規表示式視為輸入檔案的範圍。這使您可以更靈活地在程式中定義您的選擇:
3. 將新文字加入 Sed 串流
除了刪除文字之外,sed 還能夠為現有資料流添加新文字。雖然它還沒有達到成熟的文字編輯器的水平,但此功能對於一次性編輯和基本文字添加仍然很方便。
若要新增的文字行,請執行 sed 指令,a
後面接著要新增的文字:
也可以將整個文件包含到 sed 文字流中。為此,請使用以下r
命令,後面接著要新增的檔案的名稱:
4. 在 Sed 中尋找並取代文本
sed 最強大的功能之一是它能夠從文字流中尋找和取代文字。與新增和刪除文字不同,這允許您在資料通過 UNIX 管道時動態編輯數據,使其比常規文字編輯器更靈活。
首先測試列印您的文字輸入,而不對 sed 進行任何修改:
將子指令替換p
為s
,然後在其後面加上三個反斜線 (/):
在第一個和第二個反斜線之間插入要匹配的字串的結構正規表示式。例如,我可以輸入以下值來查找輸入字串中以“wo”開頭的單字:
將文字遊標放在第二個和第三個反斜線之間,然後提供要替換匹配項的文字。與上一篇專欄相反,本節不使用結構正規表示式:
預設情況下,sed 僅替換任何特定行上符合的第一個字串。如果您想要替換文字流中某個單字的每個實例,這可能會出現問題。要解決此問題,請g
在表達式的第三個反斜線後面新增選項:
5. 將文字資料複製到保留空間
Sed 使用兩個緩衝區來儲存文字資料:模式空間和保持空間。前者在文字通過 sed 表達式時充當文字的臨時位置。同時,後者充當剪貼板,您可以在其中儲存任意文字資料。
這種方法的一個好處是,它允許您「保留」某些輸出,而無需依賴外部程式。如果您打算使用 sed 處理多步驟文字操作,這可能很有用。
要開始使用保留空間,首先確保您的文件中至少包含幾行文字:
將子命令替換p
為h
,然後提供 sed 將在檔案中匹配的行號或正規表示式值。這樣做將告訴 sed 獲取該特定文字行並將其複製到其保留空間:
您也可以使用H
子命令在保留空間中儲存多行文字。例如,以下命令儲存文字檔案的第三行和第四行並將其印回終端:
6. 在 Sed 中使用標籤建立循環
雖然 sed 不是一種綜合性程式語言,但仍可以在程式內建立循環。如果您需要一個必須連續遍歷特定文字輸入片段的 sed 表達式,這非常有用。
要在 sed 中建立循環,您需要先為 sed 表達式建立一個標籤。為此,您需要使用:
子命令,後面跟著要用於表達式的標籤。
提供 sed 表達式的符合條件。就我而言,我希望它位於輸入文字中每一行的末尾:
鍵入 sed 找到符合項目時要執行的 sed 子指令,然後將其括在花括號中。以下連接兩個相鄰行,用空格替換換行符,然後回到表達式的開頭:
您甚至可以擴展它以匹配幾乎任何類型的輸入文字。例如,以下命令使用 sed 的擴充正規表示式功能從輸入文字中移除 HTML 標籤:
7. 在 Sed 中進行永久性更改
就像其他 UNIX 工具一樣,sed 可以利用輸出重定向和管道。這不僅允許您將 sed 與其他程式粘合在一起,而且還使您有機會使更改永久化。
以下程式碼行會根據 sed 指令的輸出建立一個新的「welcome.txt」檔案:
除了輸出重定向之外,您還可以使用內建-i
標誌來編輯當前文件,而不是在終端控制台中輸出變更。例如,以下命令從我的文字檔案中刪除所有換行符並保存它:
如果所有這些談話讓您對 Linux 命令列感到好奇。您可以閱讀我們之前的文章,其中我們討論了您今天可以使用的一些最有趣的 Bash 提示符。
圖片來源:摩根理查森,來自 Unsplash。所有修改和螢幕截圖均由 Ramces Red 進行。
發佈留言