Linux中國

LFCS 基礎:sed 命令

Linux 基金會認證系統管理員(LFCS)的另一個有用的命令是 「sed」,最初表示 「流式編輯器」 Streaming EDitor

sed」 命令是一個可以將文件作為流進行編輯的編輯器。流式傳輸文件的方法是從另一個命令使用管道(>|)傳遞,或將其直接載入到 「sed」 中。

該命令的工作方式與其他編輯器相同,只是文件不顯示,也不允許可視化編輯。命令被傳遞給 「sed」 來操縱流。

用 「sed」 可以做五件基本的事。當然,「sed」 如此強大,還有其他高級的功能,但你只需要集中精力在五件基本的事上。五種功能類型如下:

  1. 搜索
  2. 替換
  3. 刪除
  4. 添加
  5. 改變/變換

在深入命令參數之前,我們需要看看基本的語法。

語法

「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)

via: https://www.linux.org/threads/lfcs-sed-command.4561/

作者:Jarret B 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
1
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國