Linux sed 流編輯器指南


介紹

Sed,也稱為“流編輯器”,是一個功能強大的 Linux 命令列工具,允許您對輸入流(檔案或管道輸入)執行基本的文字轉換。Sed 特別適用於對大量檔案進行批次更改,或編輯難以使用文字編輯器開啟的檔案。本指南將作為sed 的詳細介紹,包括其語法、基本命令以及如何在不同場景中使用 sed 的示例。我們還將探討分組和原地編輯等高階功能,以幫助您掌握此多功能工具的使用。

語法

sed 命令的基本語法如下:

$ sed 'command' file

命令周圍的單引號非常重要,因為它們允許 sed 正確解釋命令。`file` 是 sed 將操作的輸入檔案。Sed 也可以接受來自管道的輸入,在這種情況下,不需要檔案引數。

命令

替換

sed 最常見的用途之一是進行替換。替換命令由“s”命令指示。基本語法如下:

$ sed 's/old-text/new-text/' file

例如,要將名為“file.txt”的檔案中所有出現的“old”字替換為“new”,請使用以下命令:

$ sed 's/old/new/' file.txt

刪除行

另一個有用的命令是 d 命令,它用於刪除與特定模式匹配的行。例如,要刪除名為“file.txt”的檔案中包含“remove”字的所有行,請使用以下命令:

$ sed '/delete/d' file.txt

插入和追加

a”命令用於在特定行之後插入文字。例如,要在名為“file.txt”的檔案的第五行之後插入“new”字,請使用以下命令:

$ sed '5a new' file.txt

i”命令用於在特定行之前插入文字。例如,要在名為“file.txt”的檔案的第五行之前插入“new”字,請使用以下命令:

$ sed '5i new' file.txt

單個 sed 命令

讓我們透過學習執行 sed 命令的不同方法,將我們目前學到的知識付諸實踐。首先,讓我們看看如何從 Unix shell 中執行單個sed命令:

$ sed [-Ealn] [-i extension] command [file ...]

除了編輯檔案的內容外,我們還應該能夠檢視它們。讓我們看看如何使用列印功能並執行相應的sed命令:

$ sed 'p' input.txt
line-1
line-1
line-2
line-2

我們可以看到,當顯式使用列印功能時,每一行都會列印兩次。這是因為sed在所有命令執行完畢後始終執行列印每一行的預設操作。此外,為了抑制此預設行為,我們可以在同一個命令中使用 -n 標誌並控制事情:

$ % sed -n 'p' input.txt
line-1
line-2

多個 sed 命令

由於搜尋對於處理文字至關重要,如果我們可以用我們自己的 sed 命令實現這種功能,那不是很好嗎?是的,這是完全可能的!

因此,讓我們繼續使用 sed 獲取 input.txt 檔案的第一行,該行包含“line”字:

$ sed -n -e '/line/ p' -e '/line/ q' input.txt
line-1

我們應該注意“-e”標誌用於分隔 sed 命令。第一個命令查詢模式並使用列印功能列印行。而第二個命令利用q函式(quit),中斷對輸入流上 sed 命令的執行。如果沒有q函式,sed 將列印所有與正則表示式匹配的行。

或者,我們也可以用分號分隔多個命令:

$ sed -n '/line/ p; /line/ q' input.txt
line-1

使用 sed 查詢和替換

sed 提供了各種功能,我們可以使用這些功能來查詢和替換文字。讓我們探索一些重要的功能。

基本替換

假設我們的團隊遵循使用空格進行程式碼縮排的約定。但是,我們經常最終使用製表符。結果,我們的同事經常要求我們在程式碼審查週期中將製表符更改為空格。為了解決這個用例,我們可以使用替換函式:

[address[,address]]s/regular expression/replacement/flags

因此,替換函式搜尋從地址範圍內選擇的每一行上的正則表示式。然後它只將第一個匹配的子字串替換為替換字串,除非我們使用標誌覆蓋此預設行為。由於我們打算重用我們的解決方案,讓我們將我們的sed命令新增到名為“indentation_fix.sed”的指令碼中:

/^[ ]+/ s/ / /g

帶分組的替換

有時我們經常需要在程式碼中進行語法修復。讓我們以在 Java 字串中訪問字元為例,我們錯誤地將其視為陣列,就像在許多其他程式語言(如C)中一樣:

String name = "string";
if (name.length() > 0) {
   System.out.println("Name starts with " + name[0]);
}

相反,我們應該使用charAt()方法來訪問位置 0 處的字元。由於我們的檔案中可能有多處此錯誤,我們可以透過使用 sed 為我們進行此更改來節省時間。

$ sed -i 's/(name)[ ]*[[ ]*]/\1.charAt(0)/g' input.txt

此命令使用分組來匹配整個模式“name[0]”並將其替換為“name.charAt(0)”。

結論

總之,sed 是一個用於編輯文字流的強大工具。它具有廣泛的匹配和替換文字的功能,使其適用於各種用例。在本指南中,我們學習了使用sed的基本知識以及如何在不同場景中執行命令,包括替換、刪除、插入和新增。我們還探討了分組和原地編輯等高階功能,以幫助您掌握此多功能工具的使用。

更新於:2023年2月13日

821 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告