如何在linux上使用sed命令

這聽起來很瘋狂,但是Linux sed命令是一個沒有介面的文字編輯器。您可以從命令列使用它來操作檔案和流中的文字。我們將向你展示如何利用它的力量。...

這聽起來很瘋狂,但是Linux sed命令是一個沒有介面的文字編輯器。您可以從命令列使用它來操作檔案和流中的文字。我們將向你展示如何利用它的力量。

sed的力量

sed命令有點像國際象棋:學習基礎知識需要一個小時,掌握它們需要一輩子(或者,至少需要大量的練習)。我們將向您展示sed功能的每個主要類別中的一些開場白。

sed是一個流編輯器,可以處理管道輸入或文字檔案。但是,它沒有互動式文字編輯器介面。更確切地說,您提供了它在閱讀文字時要遵循的說明。這些都可以在Bash和其他命令列shell中使用。

使用sed,您可以執行以下所有操作:

  • 選擇文字
  • 替換文字
  • 在文字中新增行
  • 從文字中刪除行
  • 修改(或保留)原始檔案

我們構建示例是為了介紹和演示概念,而不是生成最簡潔(最不易接近)的sed命令。然而,sed的模式匹配和文字選擇功能嚴重依賴正則表示式(regex)。你需要熟悉這些才能充分利用sed。

相關:如何在Linux上使用正則表示式(regex)

一個簡單的例子

首先,我們將使用echo透過管道向sed傳送一些文字,並讓sed替換部分文字。為此,我們鍵入以下內容:

echo howtogonk | sed 's/gonk/geek/'

echo命令將“howtogonk”傳送到sed,並應用我們的簡單替換規則(“s”表示替換)。sed在輸入文字中搜索第一個字串的匹配項,並用第二個字串替換任何匹配項。

字串“gonk”被替換為“geek”,新字串將在終端視窗中列印。

如何在linux上使用sed命令

替換可能是sed最常用的用法。不過,在深入研究替換之前,我們需要知道如何選擇和匹配文字。

選擇文字

我們的例子需要一個文字檔案。我們將使用一個包含選自塞繆爾·泰勒·柯勒律治史詩《古代水手的霧凇》的詩句

我們鍵入以下內容,以便用更少的資訊檢視它:

less coleridge.txt

如何在linux上使用sed命令

要從檔案中選擇一些行,我們提供要選擇的範圍的開始行和結束行。一個數字選擇那一行。

要提取第1行到第4行,請鍵入以下命令:

sed -n '1,4p' coleridge.txt

注意1和4之間的逗號。p表示“列印匹配行”。預設情況下,sed列印所有行。我們會看到檔案中所有的文字都列印了兩次匹配的行。為了防止這種情況,我們將使用-n(quiet)選項來抑制不匹配的文字。

我們更改行號以便選擇不同的詩句,如下所示:

sed -n '6,9p' coleridge.txt

如何在linux上使用sed命令

我們可以使用-e(表示式)選項進行多個選擇。用兩種表達方式,我們可以選擇兩首詩,如下所示:

sed -n -e '1,4p' -e '31,34p' coleridge.txt

如果我們減少第二個表示式中的第一個數字,我們就可以在兩節之間**一個空格。我們鍵入以下內容:

sed -n -e '1,4p' -e '30,34p' coleridge.txt

如何在linux上使用sed命令

我們也可以選擇一個起始行,告訴sed遍歷檔案並每隔五行列印一行,或者跳過任意數量的行。該命令類似於我們上面用來選擇範圍的命令。不過,這次我們將使用波浪號(~)而不是逗號來分隔數字。

第一個數字表示起跑線。第二個數字告訴sed我們想看的是起跑線之後的哪一行。數字2表示每第二行,3表示每第三行,依此類推。

我們鍵入以下內容:

sed -n '1~2p' coleridge.txt

如何在linux上使用sed命令

您不一定知道要查詢的文字在檔案中的位置,這意味著行號不會總是有太大幫助。但是,也可以使用sed來選擇包含匹配文字模式的行。例如,讓我們提取所有以“And”開頭的行

**符號(^)表示行的開始。我們將搜尋詞用正斜槓(/)括起來。我們還在“和”後面加了一個空格,所以像“Android”這樣的詞不會出現在結果中。

閱讀sed指令碼一開始可能有點困難。p的意思是“列印”,就像我們在上面使用的命令中一樣。但是,在下面的命令中,前面有一個正斜槓:

sed -n '/^And /p' coleridge.txt

如何在linux上使用sed命令

從檔案中提取並顯示以“And”開頭的三行。

替換

在第一個示例中,我們向您展示了sed替換的以下基本格式:

echo howtogonk | sed 's/gonk/geek/'

s告訴sed這是一個替代品。第一個字串是搜尋模式,第二個字串是要替換匹配文字的文字。當然,就像所有的Linux一樣,魔鬼在細節中。

我們鍵入以下內容以將所有出現的“日”更改為“周”,並給水手和信天翁更多的時間來聯絡:

sed -n 's/day/week/p' coleridge.txt

在第一行中,只有第二個出現的“day”被更改。這是因為sed在每行的第一場比賽後停止。我們必須在表示式末尾新增一個“g”,如下所示,以執行全域性搜尋,從而處理每行中的所有匹配項:

sed -n 's/day/week/gp' coleridge.txt

這與第一行的四分之三相符。因為第一個單詞是“Day”,sed是區分大小寫的,所以它不認為該例項與“Day”相同

我們鍵入以下內容,在表示式末尾的命令中新增一個i以表示不區分大小寫:

sed -n 's/day/week/gip' coleridge.txt

這是可行的,但您可能並不總是希望對所有內容都啟用不區分大小寫。在這些情況下,可以使用regex組新增特定於模式的大小寫不敏感。

例如,如果我們將字元括在方括號([])中,它們將被解釋為“此字元列表中的任何字元”

我們鍵入以下內容,並在組中包含“D”和“D”,以確保它同時匹配“Day”和“Day”:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

如何在linux上使用sed命令

我們還可以將替換限制為檔案的部分。假設我們的檔案第一節有奇怪的間隔。我們可以使用以下熟悉的命令來檢視第一節:

sed -n '1,4p' coleridge.txt

我們將搜尋兩個空格並用一個替換它們。我們將在全球範圍內執行此操作,以便在整個生產線中重複此操作。要清楚的是,搜尋模式是空格,空格星號(*),替換字串是單個空格。1,4將替換限制為檔案的前四行。

我們將所有這些放在下面的命令中:

sed -n '1,4 s/ */ /gp' coleridge.txt

這個很好用!搜尋模式在這裡很重要。星號(*)表示前面的零個或多個字元,即空格。因此,搜尋模式是尋找一個或多個空格的字串。

如果我們用一個空格替換多個空格的任意序列,我們會將檔案返回到規則的空格,每個單詞之間只有一個空格。在某些情況下,這也會用一個空格代替一個空格,但這不會對任何東西產生不利影響,我們仍然可以得到我們想要的結果。

如果我們鍵入以下內容並將搜尋模式縮減為單個空格,您將立即看到為什麼必須包含兩個空格:

sed -n '1,4 s/ */ /gp' coleridge.txt

如何在linux上使用sed命令

因為星號匹配前面的零個或多個字元,所以它將每個不是空格的字元視為“零空格”,並對其應用替換。

但是,如果在搜尋模式中包含兩個空格,sed必須在應用替換之前找到至少一個空格字元。這樣可以確保非空格字元保持不變。

我們使用前面使用的-e(表示式)鍵入以下內容,它允許我們同時進行兩個或多個替換:

sed -n -e 's/motion/flutter/gip' -e 's/ocean/gutter/gip' coleridge.txt

如果我們用分號(;)來分隔這兩個表示式,我們可以得到相同的結果,如下所示:

sed -n 's/motion/flutter/gip;s/ocean/gutter/gip' coleridge.txt

如何在linux上使用sed命令

在下面的命令中將“day”替換為“week”時,表示式“well a-day”中的“day”例項也被替換:

sed -n 's/[Dd]ay/week/gp' coleridge.txt

為了防止這種情況,我們只能嘗試在與另一個模式匹配的行上進行替換。如果我們修改命令,使之在開始時有一個搜尋模式,我們將只考慮在與該模式匹配的行上進行操作。

我們鍵入以下內容使匹配模式成為單詞“after”:

sed -n '/after/ s/[Dd]ay/week/gp' coleridge.txt

這給了我們想要的迴應。

如何在linux上使用sed命令

更復雜的替換

讓我們讓Coleridge休息一下,然後使用sed從etc/passwd檔案中提取名稱。

有一些較短的方法可以做到這一點(稍後將詳細介紹),但我們將在這裡使用較長的方法來演示另一個概念。搜尋模式中的每個匹配項(稱為子表示式)都可以編號(最多九個項)。然後可以在sed命令中使用這些數字來引用特定的子表示式。

必須將子表示式括在括號[()]中,才能使其工作。括號前面還必須加一個反斜槓(\),以防止它們被視為普通字元。

為此,請鍵入以下內容:

sed 's/\([^:]*\).*/\1/' /etc/passwd

如何在linux上使用sed命令

我們來分解一下:

  • sed's/:sed命令和替換表示式的開頭。
  • \(:包含子表示式的左括號[(],前面有反斜槓(\)。
  • [^:]*:搜尋項的第一個子表示式包含方括號中的組。**符號(^)在組中使用時表示“不”。組表示任何不是冒號(:)的字元都將被接受為匹配項。
  • \):右括號[)]前面有反斜槓(\)。
  • .*:第二個搜尋子表示式表示“任意字元和任意數量的字元”
  • /\1:表示式的替換部分包含1,前面有反斜槓(\)。這表示與第一個子表示式匹配的文字。
  • /':右正斜槓(/)和單引號(')終止sed命令。

這意味著我們要查詢任何不包含冒號(:)的字串,冒號將是匹配文字的第一個例項。然後,我們在該行中搜索其他內容,這將是匹配文字的第二個例項。我們將用與第一個子表示式匹配的文字替換整行。

/etc/passwd檔案中的每一行都以冒號結尾的使用者名稱開頭。我們將所有內容匹配到第一個冒號,然後用該值替換整行。所以,我們已經隔離了使用者名稱。

如何在linux上使用sed命令

接下來,我們將第二個子表示式括在括號[()]中,這樣我們也可以透過數字引用它。我們還將用\2替換\1。現在,我們的命令將用從第一個冒號(:)到行尾的所有內容替換整行。

我們鍵入以下內容:

sed 's/\([^:]*\)\(.*\)/\2/' /etc/passwd

如何在linux上使用sed命令

這些小小的改變改變了命令的含義,我們得到了除了使用者名稱之外的所有東西。

如何在linux上使用sed命令

現在,讓我們看看快速簡便的方法。

我們的搜尋詞是從第一個冒號(:)到行尾。因為替換表示式為空(//),所以我們不會用任何內容替換匹配的文字。

因此,我們鍵入以下內容,切掉從第一個冒號(:)到行尾的所有內容,只留下使用者名稱:

sed 's/:.*//" /etc/passwd

如何在linux上使用sed命令

讓我們看一個例子,在這個例子中,我們在同一個命令中引用第一個和第二個匹配項。

我們有一個用逗號(,)分隔名字和姓氏的檔案。我們希望將它們列為“姓,名”。我們可以使用cat檢視檔案中的內容,如下所示:

cat geeks.txt

與許多sed命令一樣,下一個命令一開始可能看起來難以穿透:

sed 's/^\(.*\),\(.*\)$/\2,\1 /g' geeks.txt

如何在linux上使用sed命令

這是一個與我們使用的其他命令類似的替換命令,搜尋模式非常簡單。我們將其分解如下:

  • sed的/:正常的替換命令。
  • ^:因為**符號不在組([])中,所以它表示“行的開始”
  • \(.*\),:第一個子表示式是任意字元數。它被括在括號[()]中,每個括號前面都有一個反斜槓(\),所以我們可以用數字來引用它。到目前為止,我們的整個搜尋模式都是從行的開始到第一個逗號(,)搜尋任意數量的字元。
  • \(.*\):下一個子表示式(同樣)是任意字元的任意數。它也包含在括號[()]中,兩個括號前面都有反斜槓(\),因此我們可以按數字引用匹配的文字。
  • $/:美元符號($)表示行尾,允許我們繼續搜尋行尾。我們用這個簡單地介紹了美元符號。在這裡我們並不需要它,因為在這個場景中星號(*)會出現在行的末尾。正斜槓(/)完成搜尋模式部分。
  • \2、\1/g':因為我們將兩個子表示式括在括號中,所以我們可以用它們的數字來引用它們。因為我們想顛倒順序,所以我們把它們輸入為第二個匹配,第一個匹配。數字前面必須加反斜槓(\)。
  • /g:這使我們的命令可以在每一行上全域性工作。
  • 極客.txt:我們正在處理的檔案。

也可以使用“剪下”命令(c)替換與搜尋模式匹配的整行。我們鍵入以下內容以搜尋包含單詞“neck”的行,並將其替換為新的文字字串:

sed '/neck/c Around my wrist was strung' coleridge.txt

如何在linux上使用sed命令

我們的新行現在出現在摘錄的底部。

如何在linux上使用sed命令

**行和文字

我們還可以在檔案中**新行和文字。要在任何匹配的行之後**新行,我們將使用Append命令(a)。

下面是我們要處理的檔案:

貓極客.txt

如何在linux上使用sed命令

我們已經對線路進行了編號,以便更容易理解。

我們鍵入以下內容以搜尋包含單詞“He”的行,並在其下方**新行:

sed '/He/a --> Inserted!' geeks.txt

如何在linux上使用sed命令

我們鍵入以下命令,幷包括**命令(i)以在包含匹配文字的行上方**新行:

sed '/He/i --> Inserted!' geeks.txt

如何在linux上使用sed命令

我們可以使用表示原始匹配文字的與號(&)將新文字新增到匹配行。\1、\2等表示匹配的子表示式。

要將文字新增到行的開頭,我們將使用一個與行上的所有內容匹配的替換命令,並結合一個將新文字與原始行相結合的替換子句。

要執行所有這些操作,請鍵入以下內容:

sed 's/.*/--> Inserted &/' geeks.txt

如何在linux上使用sed命令

我們鍵入以下命令,包括G命令,它將在每行之間新增一個空行:

sed 'G' geeks.txt

如何在linux上使用sed命令

如果要新增兩個或多個空行,可以使用G;G,G;G;G,依此類推。

刪除行

Delete命令(d)刪除與搜尋模式匹配的行,或使用行號或範圍指定的行。

例如,要刪除第三行,請鍵入以下內容:

sed '3d' geeks.txt

要刪除第四行到第五行的範圍,請鍵入以下內容:

sed '4,5d' geeks.txt

要刪除範圍之外的行,我們使用感嘆號(!),如下圖:

sed '6,7!d' geeks.txt

如何在linux上使用sed命令

儲存更改

到目前為止,我們所有的結果都已列印到終端視窗,但我們還沒有將它們儲存到任何地方。要使這些檔案永久化,可以將更改寫入原始檔案,也可以將更改重定向到新檔案。

覆蓋原始檔案需要謹慎。如果sed命令錯誤,可能會對原始檔案進行一些難以撤消的更改。

為了讓您放心,sed可以在執行命令之前建立原始檔案的備份。

您可以使用In-place選項(-i)告訴sed將更改寫入原始檔案,但如果向其新增副檔名,sed將把原始檔案備份到新檔案。它將具有與原始檔案相同的名稱,但具有新的副檔名。

為了演示,我們將搜尋任何包含單詞“He”的行並刪除它們。我們還將使用BAK副檔名將原始檔案備份到新檔案。

要執行所有這些操作,請鍵入以下內容:

sed -i'.bak' '/^.*He.*$/d' geeks.txt

我們鍵入以下內容以確保備份檔案不變:

cat geeks.txt.bak

如何在linux上使用sed命令

我們還可以鍵入以下命令將輸出重定向到新檔案並獲得類似的結果:

sed -i'.bak' '/^.*He.*$/d' geeks.txt > new_geeks.txt

我們使用cat來確認更改已寫入新檔案,如下所示:

cat new_geeks.txt

如何在linux上使用sed命令

把這一切都抹掉了

正如您可能已經注意到的,即使是sed上的快速入門也相當長。這個命令有很多,你可以用它做更多的事情。

然而,希望這些基本概念為你繼續學習更多的知識奠定了堅實的基礎。

  • 發表於 2021-04-02 08:03
  • 閱讀 ( 45 )
  • 分類:網際網路

你可能感興趣的文章

如何在linux上安裝和使用powershell

... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...

  • 發佈於 2021-03-16 02:34
  • 閲讀 ( 53 )

如何從usb啟動raspberry pi 3

...的USB硬碟驅動器。這是一個重要的發展,所以讓我們看看如何設定你的樹莓皮3從USB啟動。 ...

  • 發佈於 2021-03-17 12:42
  • 閲讀 ( 101 )

如何在android和termux上使用linux命令列

...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...

  • 發佈於 2021-03-18 07:26
  • 閲讀 ( 63 )

如何在windows10上獲得linux bash shell

... 如何在windows10上安裝linux bash shell ...

  • 發佈於 2021-03-21 11:48
  • 閲讀 ( 60 )

linux下如何重新命名檔案

要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...

  • 發佈於 2021-03-22 02:48
  • 閲讀 ( 67 )

如何在linux上使用groupadd管理使用者組

... 相關:如何在Linux中更改密碼 ...

  • 發佈於 2021-03-26 17:15
  • 閲讀 ( 43 )

如何在linux中新增使用者

想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...

  • 發佈於 2021-03-26 23:29
  • 閲讀 ( 69 )

如何在linux上使用rev命令

...,它沒有排列,但不,這還不算全部。本教程將向您展示如何將其組合起來進行強大的操作。 當您在更復雜的命令序列中使用rev作為構建塊時,它真正開始顯示出它的價值。rev是一組作為促進者的命令(比如tac和yes)之一。當...

  • 發佈於 2021-04-03 07:47
  • 閲讀 ( 51 )

如何列出mac上的所有應用程式

...app檔案,所以您可以更輕鬆地在硬碟上移動它們。以下是如何找到你失去的人。 從應用程式資料夾 這個方法很明顯只要開啟你的應用程式資料夾。您通常可以在側邊欄、硬碟頂部或主資料夾(上面有您名字的資料夾)中找到...

  • 發佈於 2021-04-03 17:06
  • 閲讀 ( 35 )

如何使用bash從subreddit中獲取主題列表

Reddit為每個subreddit提供JSON提要。下面是如何建立一個Bash指令碼,從您喜歡的任何subreddit下載並解析帖子列表。這只是Reddit的JSON提要可以做的一件事。 安裝捲曲和jq 我們將使用curl從Reddit和jq獲取JSON提要,解析JSON資料並從結果...

  • 發佈於 2021-04-03 18:06
  • 閲讀 ( 44 )
鐵頭天吳
鐵頭天吳

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦