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的基本知識以及如何在不同場景中執行命令,包括替換、刪除、插入和新增。我們還探討了分組和原地編輯等高階功能,以幫助您掌握此多功能工具的使用。