學習使用 Sed 文本編輯器
sed
命令是為 AT&T 最初的 Unix 操作系統第 7 版創建的,此後,可能每一個 Unix 和 Linux 操作系統都包含了它。sed
應用程序是一個 流編輯器,與文本編輯器不同的是,它不會打開一個視覺緩衝區,將文件的數據載入到其中進行處理。相反,它根據在終端輸入的命令或腳本中的一系列命令,逐行對文件進行操作。
安裝
如果你使用的是 Linux、BSD 或 macOS,那麼你已經安裝了 GNU 或 BSD 版的 sed
。這是兩個不同的原始 sed
命令的重新實現,雖然它們很相似,但也有一些小的區別。GNU sed
通常被認為是功能最豐富的 sed
,而且它在這些平台上都可以廣泛使用。
如果你找不到 GNU sed
(在非 Linux 系統上通常被稱為 gsed
),那麼你可以從 GNU 網站上下載它的源代碼。安裝 GNU sed
的好處是,可以使用它的額外功能,但它也可以被限制為只符合 sed
的 POSIX 規範,如果你需要移植性的話。
在 Windows 上,你可以用 Chocolatey 來安裝 GNU sed
。
Sed 如何工作
sed
應用程序一次只處理一行。因為它沒有視覺顯示,所以它在內存中創建了一個模式空間:一個包含輸入流的當前行的空間(去掉任何尾部的換行符)。一旦填充了模式空間,你對 sed
的指令就會被執行。有時你的指令是有條件的,有時是無條件的,所以這些指令的結果取決於你如何使用 sed
。
當命令結束時,sed
會將模式空間的內容列印到輸出流中。默認的輸出流是標準輸出,但可以將其重定向到一個文件,甚至使用 --in-place=.bak
選項重定向到同一個文件中。
然後再從下一個輸入行開始循環。
sed
命令的語法是:
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
找到你要編輯的內容
在可視化編輯器中,你通常不需要考慮太多,就能在文本文件中找到你想要修改的內容。你的眼睛(或屏幕閱讀器)會掃描文本,找到你想改變的單詞或你想插入或刪除文本的地方,然後你就可以開始輸入了。而 sed
沒有交互模式,所以你需要告訴它必須滿足什麼條件才能運行特定的命令。
在這些例子中,假設一個名為 example.txt
的文件包含了這樣的文字:
hello
world
This is line three.
Here is the final line.
行號
指定行號告訴 sed
只對文件中的那一行進行操作。
例如,下面這條命令選擇文件的第 1 行並列印出來。因為 sed
在處理後的默認操作也是列印一行到標準輸出,這樣做的效果就是重複第一行:
$ sed '1p' example.txt
hello
hello
world
This is line three.
Here is the final line.
你也可以步進式指定行號。例如,1~2
表示每兩行選擇一行(「從第一行開始每兩行選擇一行」)。指令 1~3
表示從第一行開始,每三行選擇一行:
$ sed '1p' example.txt
hello
hello
world
This is line three.
Here is the final line.
Here is the final line.
行定位
你可以通過使用 $
作為選擇器,只對文件的最後一行進行操作:
$ sed '$p' example.txt
hello
world
This is line three.
Here is the final line.
Here is the final line.
在 GNU sed
中,你可以選擇多行(例如,sed '1,$p'
列印第一行和最後一行)。
反轉
任何數字或位置的選擇,你都可以用感嘆號(!
)字元反轉。下面這將選擇除第一行以外的所有行:
$ sed '1!p' example.txt
hello
world
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
模式匹配
你可以把模式匹配想像成文字處理器或瀏覽器中的查找操作。你提供一個詞(一個 模式),然後選擇了結果。模式匹配的語法是 /pattern/
:
$ sed '/hello/p' example.txt
hello
hello
world
This is line three.
Here is the final line.
$ sed '/line/p' example.txt
hello
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
用 Sed 編輯
一旦你找到了你要編輯的內容,你就可以執行你想要的任何操作。你可以用 sed
中的命令來執行編輯。sed
中的命令不是 sed
命令本身。如果這樣說有幫助的話,可以把它們看作是「動作」或「動詞」或「指令」。
sed
中的命令是單個字母,例如前面例子中使用的列印命令的 p
。它們一開始可能很難記憶,但和所有事情一樣,你會隨著練習而了解它們。
p 代表列印
p
指令列印當前模式空間中的任何內容。
d 用於刪除
d
指令刪除模式空間:
$ sed '$d' example.txt
hello
world
This is line three.
$ sed '1d' example.txt
world
This is line three.
Here is the final line.
s 用於搜索和替換
s
命令搜索一個模式並將其替換為其他東西。這可能是 sed
最流行和最隨意的用法,而且它通常是用戶學習的第一個(有時也是唯一的)sed
命令。幾乎可以肯定它是文本編輯中最有用的命令:
$ sed 's/world/opensource.com/' example.txt
hello
opensource.com
This is line three.
Here is the final line.
在你的替換文本中,也可以使用一些特殊的功能。例如,L
將替換文本轉換為小寫,l
則只轉換下一個字元。還有其他一些功能,列在 sed
文檔中(你可以用 info sed
命令查看)。
替換子句中的特殊字元 &
指的是匹配到的模式:
$ sed 's/is/U&/' example.txt
hello
world
ThIS is line three.
Here IS the final line.
你也可以通過特殊的標誌來影響 s
如何處理它找到的內容。g
(應該是指 全局)標誌告訴 s
對行上找到的所有匹配項進行替換,而不僅僅是第一個匹配項:
$ sed 's/is/U&/g' example.txt
hello
world
ThIS IS line three.
Here IS the final line.
其他重要的標誌還包括用一個數字來表示要影響第幾個出現的匹配模式:
$ sed 's/is/U&/2' example.txt
hello
world
This IS line three.
Here is the final line.
w
標誌,後面跟著一個文件名,_只有_在有變化的情況下,才會將匹配的行寫入文件:
$ sed 's/is/U&/w sed.log' example.txt
hello
world
ThIS is line three.
Here IS the final line.
$ cat sed.log
ThIS is line three.
Here IS the final line.
標誌可以組合:
$ sed 's/is/U&/2w sed.log' example.txt
hello
world
This IS line three.
Here is the final line.
$ cat sed.log
This IS line three.
腳本
有很多很棒的網站都有 sed
「單行腳本」,它們給你提供了面向任務的 sed
命令來解決常見的問題。然而,自己學習 sed
可以讓你寫出自己的單行腳本,而且這些單行腳本可以根據你的具體需求來定製。
sed
的腳本可以在終端中寫成一行,也可以保存到文件中,然後用 sed
本身執行。我傾向於把小腳本寫成一個命令,因為我發現自己在現實生活中很少重複使用 sed
命令。當我寫一個 sed
腳本時,通常都是針對一個文件的。例如,在寫完這篇文章的初稿後,我用 sed
來規範 「sed」 的大小寫,而這是我可能永遠也不會再做的任務。
你可以向 sed
發出一系列不同的命令,用分號(;
)分開。
$ sed '3t ; s/line/U&/' example.txt
hello
world
This is LINE three.
This is the final line.
帶括弧的範圍改變
你也可以用大括弧({}
)限制哪些結果受到影響。當你將 sed
命令用大括弧括起來時,它們只適用於特定的選擇。例如,「line」 字出現在樣本文本的兩行中。你可以通過聲明所需的匹配條件($
表示最後一行),並將你希望執行的 s
命令放在緊隨其後的括弧中,強制 sed
隻影響最後一行:
$ sed '$ {s/line/U&/}' example.txt
hello
world
This is line three.
This is the final LINE.
學習 Sed
你可以用 sed
做的事情比本文所解釋的多得多。我甚至還沒有涉及到分支(b
)、測試(t
)、保留空格(H
)和許多其他功能。就像 ed 一樣,sed
可能不是你要用來創建文檔的文本編輯器,甚至不是你需要做的每一個腳本任務中使用的文本編輯器,但它是你作為 POSIX 用戶的一個強大的選擇。學習 sed
命令的結構以及如何編寫簡短的腳本可以快速修改大量的文本。閱讀 GNU sed
的info
頁面,或者 BSD sed
的手冊頁,看看 sed
能為你做什麼。
via: https://opensource.com/article/20/12/sed
作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive