LFCS 基礎:sed 命令
Linux 基金會認證系統管理員(LFCS)的另一個有用的命令是 “sed”,最初表示“流式編輯器” 。
“sed” 命令是一個可以將檔案作為流進行編輯的編輯器。流式傳輸檔案的方法是從另一個命令使用管道(>
或 |
)傳遞,或將其直接載入到 “sed” 中。
該命令的工作方式與其他編輯器相同,只是檔案不顯示,也不允許視覺化編輯。命令被傳遞給 “sed” 來操縱流。
用 “sed” 可以做五件基本的事。當然,“sed” 如此強大,還有其他高階的功能,但你只需要集中精力在五件基本的事上。五種功能型別如下:
- 搜尋
- 替換
- 刪除
- 新增
- 改變/變換
在深入命令引數之前,我們需要看看基本的語法。
語法
“sed” 命令的語法是:
sed [選項] 命令 [要編輯的檔案]
本文將在適當的部分中介紹這些“選項”。“命令”可以是正規表示式的搜尋和替換模式。請繼續閱讀了解 “sed” 如何工作的並學習基本命令。正如我之前提到的,“sed” 是一個非常強大的工具,有更多的選項可用,我將在本文中介紹。
示例檔案
如果你開啟一個終端,那你可以建立一個用於 “sed” 示例的檔案。執行以下命令:
cd ~
grep --help >grephelp.txt
你現在應該在 HOME 資料夾中有一個名為 grephelp.txt
的檔案。該檔案的內容是 grep
命令的幫助說明。
搜尋
搜尋特定字串是編輯器的常見功能,在 “sed” 中執行搜尋也不例外。
執行搜尋以在檔案中查詢字串。我們來看一下基本的搜尋。
如果我們想在示例檔案搜尋 PATTERN
這個詞,我們將使用如下命令:
sed -n 's/PATTERN/PATTERN/p' grephelp.txt
注意: 如果剪下貼上命令,請確保將單引號替換為鍵盤上的標準單引號。
引數 -n
用於抑制每行的自動列印(除了用 p
命令指定的行)。預設情況下,流入 “sed” 的每一行將被列印到標準輸出(stdout)。如果你不使用 “-n” 選項執行上述命令,你將看到原始檔案的每一行以及匹配的行。
要搜尋的檔名是我們在“示例檔案”部分中建立的 “grephelp.txt”。
剩下的部分是 's/PATTERN/PATTERN/p'
。這一段基本分為四個部分。第一部分的 s
指定執行替換,或搜尋並替換。
剩下的第二部分和第三部分是模式。第一個是要搜尋的模式,最後一個是替換流中匹配字串的模式。此例中,我們找到字串 PATTERN
,並用 PATTERN
替換。透過查詢和替換相同的字串,我們完全不會更改檔案,甚至在螢幕上也一樣。
最後一個命令是 p
。 它指定在替換後列印新行。當然,因為替換的是相同的字串,所以沒有改變。由於我們使用 -n
引數抑制列印行,所以更改的行將使用 p
命令列印。
這個完整的命令允許我們執行搜尋並檢視匹配的結果。
替換
當搜尋特定字串時,你可能希望用匹配的字串替換新字串。用另一個字串替換是很常見的操作。
我們可以使用以下命令執行相同的搜尋:
sed -n 's/PATTERN/Pattern/p' grephelp.txt
在這時,字串 “PATTERN” 變為 “Pattern” 並顯示。如果你使用命令 cat grephelp.txt
檢視檔案,你會看到該檔案沒有更改。該更改僅對螢幕上的輸出進行。你可以使用以下命令將輸出透過管道傳輸到另一個檔案:
sed 's/PATTERN/Pattern/' grephelp.txt > grephelp1.txt
現在將存在一個名為 grephelp1.txt
的新檔案,其中儲存了更改的檔案。如果 p
作為第四個選項留下,那麼有個問題是被替換的字串的每一行將在檔案中重複兩次。我們也可以刪除 “-n” 引數以允許所有的行列印。
使用相同字串替換字串的另一種方法是使用 &
符號來表示搜尋字串。例如,命令 s/PATTERN/&/p
效果是一樣的。我們可以新增字串,例如新增 S
,可以使用命令 s/PATTERN/&S/p
。
如果我們希望在每一行中只替換某種模式呢?可以指定要替換的匹配項的特定出現。當然,每一行的替換都是一個特定的編號。例如,示例檔案上有很多破折號。一些行至少有兩條破折號,所以我們可以用另一個字元代替每一行的第二個破折號。每行用星號 *
替換第二個破折號 -
的命令將是:
sed 's/-/*/2' grephelp.txt
在這裡,我們用最初的 s
來執行替換。字元 -
被替換為 *
。2
表示我們想要替換每行上的第二個 -
(如果存在)。如果我們忽略了命令 2
,則替換第一次出現的破折號。只有第一個破折號而不是每行的破折號都被替換。
如果要搜尋並替換帶有星號的行上的所有破折號,請使用 g
命令:
sed 's/-/*/g' grephelp.txt
命令也可以組合。假設你想要替換從第二次開始出現的破折號,命令將是:
sed 's/-/*/2g' grephelp.txt
現在從第二個開始出現的破折號將被星號取代。
刪除
搜尋過程中有很多時候你可能想要完全刪除搜尋字串。
例如,如果要從檔案中刪除所有破折號,你可以使用以下命令:
sed 's/-//g' grephelp.txt
替換字串為空白,因此匹配的字串將被刪除。
新增
當找到匹配時,你可以新增一行特定的文字,來使這行在瀏覽或列印中突出。
如果要在匹配後插入新行,那麼使用 a
命令,後面跟上新行的字串。還包括要匹配的字串。例如,我們可以找到一個 --
,並在匹配的行之後新增一行。新行的字串將是 double dash before this line
。
sed '/--/ a "double dash before this line"' grephelp.txt
如果要在包含匹配字串的行之前加上這行,請使用 i
命令,如下所示:
sed '/--/ i "double dash after this line"' grephelp.txt
改變/變換
如果需要改變/變換一行,則可以使用命令 c
。
假設我們有個有一些私人資訊的文件,我們需要更改包含特定字串的行。c
命令將改變整行,而不僅僅是搜尋字串。
假設我們想要阻止示例檔案中包含單詞 PATTERN
的每一行。更改的行將顯示為 This line is Top Secret
。命令是:
sed '/PATTERN/ c This line is Top Secret' grephelp.txt
可以進行更改特定字母的大小寫的轉換。例如,我們可以使用命令 y
將所有小寫 a
更改為大寫 A
,如下所示:
sed 'y/a/A/' grephelp.txt
可以指定多個字母,如 abdg
,如下命令所示:
sed 'y/abdg/ABDG/' grephelp.txt
確保第二組字母與第一組字母的順序相同,否則會被替換和轉換。例如,字串 y/a/D/
將用大寫 D
替換所有小寫的 a
。
就地更改
如果你確實要更改所使用的檔案,請使用 -i
選項。
例如,要將 PATTERN
改為 Pattern
,並對檔案進行更改,則命令為:
sed -i 's/PATTERN/Pattern/' grephelp.txt
現在檔案 grephelp.txt
將被更改。-i
選項可以與上述任何命令一起使用來更改原始檔案的內容。
練習這些命令,並確保你理解它們。“sed” 命令非常強大。
(題圖:Pixabay,CC0)
相關文章
- Linux基礎命令---文字編輯sedLinux
- 『忘了再學』Shell基礎 — 30、sed命令的使用
- LINUX命令-sedLinux
- Linux命令篇 - sed 命令Linux
- Linux sed命令用法Linux
- linux之 sed命令Linux
- sed命令小記
- Linux sed 命令詳解Linux
- Linux命令-Sed用法教程Linux
- sed命令語法詳解
- sed 命令詳解及示例
- shell 基礎命令
- MySQL基礎命令MySql
- 命令列基礎命令列
- linux 命令 基礎Linux
- nmap基礎命令
- MongoDB基礎命令MongoDB
- Linux基礎命令Linux
- 常用基礎Linux操作命令總結與hadoop基礎操作命令LinuxHadoop
- sed命令和find命令的結合的使用
- &符號在sed命令中使用符號
- Linux sed命令詳細說明Linux
- sed命令簡單使用示例分享
- 高效而輕鬆的sed命令
- Linux基礎命令—mkswapLinux
- Linux基礎命令---mknodLinux
- Linux基礎命令---mkfsLinux
- Linux基礎命令---mktempLinux
- Linux基礎命令---sudoLinux
- Linux基礎命令---yesLinux
- Linux基礎命令---shutdownLinux
- Linux基礎命令---serviceLinux
- Linux基礎命令—sudoLinux
- Linux基礎命令—calLinux
- Linux基礎命令—dateLinux
- Linux基礎命令—lastLinuxAST
- Linux基礎命令---dateLinux
- Linux基礎命令---lastLinuxAST
- Linux基礎命令---lsusbLinux