Linux必知必會sed命令教程

2021-03-02 高性能伺服器開發

目錄:

介紹工作原理正則表達式基本語法數字定址和正則定址基本子命令實戰練習

介紹

熟悉 Linux 的同學一定知道大名鼎鼎的 Linux 三劍客,它們是 grep、awk、sed,我們今天要聊的主角就是 sed。

sed 全名叫 stream editor,流編輯器,用程序的方式來編輯文本,與 vim 的交互式編輯方式截然不同。它的功能十分強大,加上正則表達式的支持,可以進行大量的複雜文本的編輯操作。

實際上 sed 提供的功能非常複雜,有專門的書籍講解它。本文不會講 sed 的全部東西,只會從 sed 的工作原理、常見使用方法等方面進行說明和講解,同時也會給出大量的實踐用例來幫助更好的理解 sed 基本用法。文中的知識點真正掌握後,足以應付平時工作中的基本需求。

它有自己的使用場景:

工作原理

sed 作為一種非交互式編輯器,它使用預先設定好的編輯指令對輸入的文本進行編輯,完成之後輸出編輯結果。

簡單描述 sed 工作原理:

這樣不斷重複,直到文件末尾,文件內容並沒有改變,除非你使用重定向輸出或指定了 i 參數

正則表達式

sed 基本上就是在玩正則表達式模式匹配,所以,會玩 sed 的人,正則表達式能力一般都比較強。正則表達式內容相對較多,本節不會重點講解正則表達式。

為了能夠讓大部分朋友比較輕鬆地學習本文知識,這裡還是簡單介紹下正則表達式的基本內容。如果是專門做正則編程開發的,可以去買本正則的書籍來看。

(一)基本正則表達式

.,表示匹配任意一個字符,除了換行符,類似 Shell 通配符中的 ?;

*,表示前邊字符有 0 個或多個;

.*,表示任意一個字符有 0 個或多個,也就是能匹配任意的字符;

^,表示行首,也就是每一行的開始位置,^abc 匹配以 abc 開頭的字符串;

$,表示行尾,也就是每一行的結尾位置,}$ 匹配以大括號結尾的字符串;

{},表示前邊字符的數量範圍,{2},表示重複 2 次,{2,}重複至少 2次,{2,4} 重複 2-4 次;

[],括號中可以包含表示字符集的表達式,使用方法大概如下幾種

(二)擴展正則表達式

擴展正則表達式使用頻率上沒有基本表達式那麼高,但依然很重要,很多情況下沒有擴展正則是搞不定的,sed 命令使用擴展正則時需要加上選項 -r。

基本語法

先介紹下 sed 的基本語法。

sed [選項] 'command' filename

選項部分,常見選項包括:-n、-e、-i、-f、-r 等。

command 子命令格式:

[地址1, 地址2] [函數] [參數(標記)]

選項簡單說明:

-n,表示安靜模式。默認 sed 會把每行內容處理完畢後列印到屏幕上,加上選項後就不會輸出到屏幕上。

-e,如果需要用 sed 對文本內容進行多種操作,則需要執行多條子命令來進行操作;

-i,默認 sed 只會處理模式空間的副本內容,不會直接修改文件,如果需要修改文件,就要指定 -i 選項;

-f,如果命令操作比較多時,用 -e 會有點力不從心,這時需要把多個子命令寫入腳本文件,使用 -f 選項指定執行該腳本;

-r:如果需要支持擴展正則表達式,那麼需要添加 -r 選項;

數字定址和正則定址

默認情況下 sed 會對每一行內容進行匹配、處理、輸出,有時候我們不需要對所有內容進行操作,只需要修改一種一部分,比如 1-10 行,偶數行,或包括 hello 字符串的行。

這種情況下,就需要我們去定位特定的行來進行處理,而不是全部內容,這裡把定位指定的行叫做 定址

(一)數字定址

數字定址其實就是通過數字去指定要操作的行,有幾種方式,每種方式都有不同的應用場景。

# 只將第4行中hello替換為A
$ sed '4s/hello/A/g' file.txt
# 將第2-4行中hello替換為A
$ sed '2,4s/hello/A/g' file.txt
# 從第2行開始,往下數4行,也就是2-6行
$ sed '2,+4s/hello/A/g' file.txt
# 將最後1行中hello替換為A
$ sed '$s/hello/A/g' file.txt
# 除了第1行,其它行將hello替換為A
$ sed '1!s/hello/A/g' file.txt

(二)正則定址

正則定址,是通過正則表達式的匹配來確定需要處理編輯哪些行,其它行就不需要處理

# 將匹配到hello的行執行刪除操作,d 表示刪除
$ sed '/hello/d' file.txt
# 刪除空行,"^$" 表示空行
$ sed '/^$/d' file.txt
# 將匹配到以ts開頭的行到以te開頭的行之間所有行進行刪除
$ sed '/^ts/,/^te/d' file.txt

(三)數字定址和正則定址混用

數字定址和正則定址可以配合使用

# 匹配從第1行到ts開頭的行,把匹配的行執行刪除
$ sed '1,/^ts/d' file.txt

基本子命令

(一)替換子命令s

子命令 s 為替換子命令,是平時 sed 使用最多的命令,因為支持正則表達式,功能很強大,基本可以替代 grep 的基本用法。

基本語法:

[address]s/pat/rep/flags

替換子命令基本用法

# 將每行的hello替換為HELLO,只替換匹配到的第一個
$ sed 's/hello/HELLO/' file.txt
# 將匹配到的hello全部替換為HELLO,g表示替換一行所有匹配到的
$ sed 's/hello/HELLO/g' file.txt
# 將第2次匹配到的hello替換
$ sed 's/hello/A/2' file.txt
# 將第2次後匹配到的所有都替換
$ sed 's/hello/A/2g' file.txt
# 在行首加#號
$ sed 's/^/#/g' file.txt
# 在行尾加東西
$ sed 's/$/xxx/g' file.txt

正則表達式的簡單使用

# 使用擴展正則表達式,結果為:A
$ echo "hello 123 world" | sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/'

# <b>This</b> is what <span style="x">I</span> meant
# 要求:去掉上述html文件中的tags
$ sed 's/<[^>]*>//g' file.txt

多個匹配

# 將1-3行的my替換為your,且3行以後的This替換為That
$ sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
# 等價於
$ sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

使用匹配到的變量

# 將匹配到的字符串前後加雙引號,結果為:My "name" chopin
# "&"表示匹配到的整個結果集
$ echo "My name chopin" | sed 's/name/"&"/'

# 如下命令,結果為:hello=world,"\1"和"\2"表示圓括號匹配到的值
$ echo "hello,123,world" | sed 's/\([^,]\),.*,\(.*\)/\1=\2/'

其它幾個常見用法

# 只將修改匹配到行內容列印出來,-n關閉了模式空間的列印模式
$ sed -n 's/i/A/p' file.txt

# 替換是忽略大小寫,將大小寫i替換為A
$ sed -n 's/i/A/i' file.txt

# 將替換後的內容另存為一個文件
$ sed -n 's/i/A/w b.txt' file.txt
$ sed -n 's/i/A/' file.txt > b.txt

注意,sed 修改匹配到的內容後,默認行為是不保存到原文件,直接輸出修改後模式空間的內容,如果要修改原文件需要指定 -i 選項。

(二)追加行子命令a

子命令 a 表示在指定行下邊插入指定的內容行;

# 將所有行下邊都添加一行內容A
$ sed 'a A' file.txt
# 將文件中1-2行下邊都添加一行內容A
$ sed '1,2a A' file.txt

(三)插入行子命令i

子命令 i 和 a 使用基本一樣,只不過是在指定行上邊插入指定的內容行

# 將文件中1-2行上邊都添加一行內容A
$ sed '1,2i A'

(四)替換行子命令c

子命令 c 是表示把指定的行內容替換為自己需要的行內容

# 將文件所有行都分別替換為A
$ sed 'c A' file.txt
# 將文件中1-2行內容替換為A,注意:兩行內容變成了一行A
$ sed '1,2c A' file.txt
# 將1-2行內容分別替換為A行內容
$ sed '1,2c A\nA' file.txt

(五)刪除行子命令d

子命令 d 表示刪除指定的內容行,這個很容理解

# 將文件中1-3行內容刪除
$ sed '1,3d' file.txt
# 將文件中This開頭的行內容刪除
$ sed '/^This/d' file.txt

(六)設置行號子命令=

子命令 =,可以將行號列印出來

# 將指定行上邊顯示行號
$ sed '1,2=' file.txt
# 可以將行號設置在行首
$ sed '=' file.txt | sed 'N;s/\n/\t/'

(七)子命令N

子命令 N,把下一行內容納入當緩存區做匹配,注意的是第一行的 \n 仍然保留

其實就是當前行的下一行內容也讀進緩存區,一起做匹配和修改,舉個例子吧

# 將偶數行內容合併到奇數行
$ sed 'N;s/\n//' file.txt

哈哈,是不是很簡單?

實戰練習

掌握了上邊的基礎命令操作後,基本上可以滿足平時 95% 的需求啦。sed 還有一些高級概念,比如:模式空間、保持空間、高級子命令、分支和測試等,平時使用概率非常小,本文就暫不講解了,有需要的同學可以私信我一起交流學習哈。

學習了這麼多基礎用法後,只要你勤加練習,多實踐,多使用,一定可以得心應手,極大提高的文本處理效率。下邊我簡單再給出一些比較實用的操作實踐,希望對大家有幫助。

1. 刪除文件每行的第二個字符

$ sed -r 's/(.)(.)(.*)$/\1\3/' file.txt

2. 交換每行的第一個字符和第二個字符

$ sed -r 『s/(.)(.)(.*)/\2\1\3/』 file.txt

3. 刪除文件中所有的數字

$ sed 's/[0-9]//g' file.txt

4. 用制表符替換文件中出現的所有空格

$ sed -r 's/ +/\t/g' file.txt

5. 把所有大寫字母用括號()括起來

$ sed -r 's/([A-Z])/(\1)/g'

6. 隔行刪除

$ sed '0~2{d}' file.txt

7. 刪除所有空白行

$ sed '/^$/d' file.txt

好了,以上是 sed 命令常用的全部內容。想要熟練掌握,只有多實踐,多練習正則表達式的使用,一旦熟練掌握後,相信在日後工作中一定會產生巨大作用的。

相關焦點

  • Linux常用命令 - sed
    使用 sed 搜索和替換文本的一般形式如下:sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE-i 將其輸出寫入標準輸出seds 替代命令,可能是 sed 中使用最多的命令-/分隔符字符。
  • Linux 三劍客 Awk、Sed、Grep 命令詳解
    -e #以指定的指令來處理輸入的文本文件-n  #取消默認輸出(如果和p命令同時使用只會列印發生改變的行)-h #幫助-V #顯示版本信息常用命令a #在當前行下面插入文本i #在當前行上面插入文本c #把選定的行改為新的文本
  • Linux學習教程-Linux下文件內容操作
    grep的用法很多,支持正則表達式匹配,這裡不展開,可以自己查閱資料,或在後期的教程涉及到時再學習。# 第一個錯誤,漏掉了文件名# 程序靜止在這,等待用戶的進一步輸入# ctrl+c殺掉當前命令ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' | tail -n 3^C# 第二個錯誤,文件名和單引號之間沒有空格,使得sed判斷命令錯誤ct@ehbio:~/ehbio_project$ sed 's/ HAHA//'ehbio.fa | tail -
  • 如何使用Linux sed命令進行字符串替換
    Linux中sed命令功能強大,本文將詳細介紹如何使用sed命令進行字符串替換。一、基本的替換命令格式1:sed 's/原字符串/新字符串/' 文件命令格式2:sed 's/原字符串/新字符串/g' 文件這兩種命令格式的區別在於是否有個「g」。沒有「g」表示只替換第一個匹配到的字符串,有「g」表示替換所有能匹配到的字符串,「g」可以認為是「global」(全局的)的縮寫,沒有「全局的」結尾就不要替換全部,這樣就好記啦。
  • Linux mkdir 命令的初學者教程 | Linux 中國
    編譯自 | https://www.howtoforge.com/linux-mkdir-command/  作者 | Himanshu Arora
  • Linux 上 12 個高效的文本過濾命令
    $ man awk2、 sed 命令sed[3] 是一款過濾和轉換文本的強大的流編輯器。我們已經寫了兩篇關於 sed 的有用的文章,你可以通過這兒來了解:sed 的 man 手冊已經添加控制選項和說明:$ man sed3、 grep、 egrep、 fgrep、 rgrep 命令行這些過濾器輸出匹配指定模式的行。它們從一個文件或者標準輸入讀取行,並且輸出所有匹配的行,默認輸出到標準輸出。
  • 海量數據處理之cut、awk、sed命令詳解,數據分析必備技能,不難
    數據都存儲在文件中,文件中肉眼可見的數據無非就是各種有規則的字符的組合,比如日誌文件,小文件我們還可以認真閱讀,但是給你一個10M大小的數據文件,不亞於閱讀一本小說,更何況密密麻麻都是數據,我們可以通過cut、awk、sed這三個命令從規則文件中提取符合我們需要的數據,重要的是他們的運行速度非常的塊。
  • Linux教程之Linux mkdir 創建文件夾命令
    Linux教程之Linux mkdir 創建文件夾命令 Linux(Ubuntu/Fedora/CentOS/RetHat)可以通過GMONE和KDE界面直接創建文件夾和文件目錄。當然,有時候直接通過終端用 mkdir 命令來創建會更方便,特別是在Root權限的文件夾和目錄中......
  • 面試題linux命令之awk
    無論是在測試還是開發崗位的面試招聘中,都會被提問到:是否了解linux系統,經常使用linux命令有哪些,接著可能會出一道題目,找出下列文本中的哪些值
  • linux命令大全
    雖然,大部分人最熟悉的還是WINDOWS用戶,但是總有各種各樣的原因讓我們選擇linux,不論因為何種原因開始接觸linux,但都希望大家儘快進入到Linux的世界裡,玩轉Linux高手,最終發現linux的可愛之處。本文將linux命令大致分為了10個部分:文件管理、磁碟管理、文檔編輯、文件傳輸、磁碟維護、網絡通訊、系統管理、系統設置、備份壓縮、設備管理。各位看官可將本文收藏,以備將來不時之需。
  • Linux常用命令 awk 入門基礎教程
    在使用awk命令的過程中,可以使用邏輯操作符「&&」和「||」;也可以進行簡單的數學運算,如+ 、-、、/、%、^分別表示加、減、乘、除、取餘、乘方。**awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個欄位。
  • sed命令的基礎知識及簡單應用
    Sed是一Linux命令,全稱:Stream Editor,功能和awk類似,但是沒有awk功能強大,相對簡單,awk處理列的功能比awk差很多。Sed主要用於自動編輯一個或者多個文件,多用於腳本中對文件的處理。Sed命令對文件的進行增加、刪除、修改和查找操作,所以是學好sed命令是寫自動化腳本必須的基礎之一。
  • Linux三大劍客之sed(上)
    3.2 命令行選項完整格式調用sed:sed OPTIONS... [SCRIPT] [INPUTFILE...]sed可能被以下命令行選項調用: --version:列印版本信息。--help:列印簡要幫助信息並退出。
  • 【Linux】常用命令之 awk 常用實例
    在使用awk命令的過程中,可以使用邏輯操作符「&&」和「||」;也可以進行簡單的數學運算,如+ 、-、、/、%、^分別表示加、減、乘、除、取餘、乘方。**awk從輸入文件或者標準輸入中讀入信息,與sed一樣,信息的讀入也是逐行讀取的。不同的是,awk命令將文本文件中的一行視為一個記錄,而將一行中的某一部分(列)作為記錄的一個欄位。
  • 軟體測試基礎之linux常用命令
    pwd 顯示當前所在路徑reboot:重啟命令。ls 查看當前目錄ls+空格+ -a:查看目錄,包括隱藏文件ls+空格+ -l:查看詳細信息ll:因為ls –l這個操作會被頻繁運用,所以衍生了這樣一種簡寫形式ls+空格
  • Linux常用命令:nslookup,lsmd5sum,uname,history等
    在linux中,文件、文件夾、驅動、命令、腳本都視為文件。9、mkpasswd此命令根據指定長度,產生一個難猜的隨機密碼。其中-l表示長度(Length)。如下圖產生15位的隨機密碼。13、cd此命令代表改變目錄。它在終端中改變工作目錄來執行複製、移動、讀、寫等。如"cd ~"會改變工作目錄為用戶的家目錄,"cd .."表示從當前目錄切換到(當前工作目錄的)父目錄。
  • Git 必知必會《下》
    來源|微信公眾號 無量測試之道Git 必知必會
  • 20分鐘吃掉Linux常用命令40式
    #切換到上級目錄, linux中一個點表示當前路徑,二個點表示當前路徑上級路徑例2:cd ~ #切換到主目錄例3:cd /User/liangyun03/ # 切換到某個絕對路徑,linux中以/開頭的路徑表示絕對路徑例4:cd
  • Linux系統和Shell命令行簡介,走上數據分析之路
    在一般的系統當中,都可以在這個目錄下找到linux常用的命令。系統所需要的那些命令位於此目錄或/usr/bin、/usr/local/bin中。/etc:etc (Editable Text Configuration) 目錄是linux系統中最重要的目錄之一。此目錄下存放了系統管理所需的各種配置文件和子目錄。
  • 走進Linux(下)——arch linux的安裝教程
    New走進Linux(下)——arch linux的安裝教程一、為什麼選擇arch Linux?相比Debian/Ubuntu、SUSE、RedHat/Fedora 等其他發行版, Arch Linux 屬於輕量級選手,其簡單的設計讓它容易被輕鬆擴展和配置成為任何想要的系統類型。