|
|
|
|
|
在 Linux 中,談論基本的文本搜索和操作時,grep
和 sed
命令往往會出現(xiàn)。grep
是基于行的搜索實用程序,主要用于從一個或多個文件中返回與特定搜索詞匹配的行。sed
是類似的,因為它是一個逐行樣式的實用程序,但更多的是用于文本行內的字符串替換。在某些情況下,許多高級用戶會將 grep
的搜索功能與 sed
的替換功能相結合,以實現(xiàn)比 Python 腳本快幾個數(shù)量級的高效文本操作。
grep
grep
是一個逐行搜索實用程序,它將查看文件的每一行并檢查與給定搜索詞的匹配項。
假設你有一個未排序的文件(或多個文件)名稱。
Kumail Nanjiani
Thomas Middleditch
Amanda Crew
Josh Brener
T.J. Miller
Zach Woods
Martin Starr
Josh Chang
然后假設你只想列出名字為“Josh”的人,你可以編寫一個簡單的 grep
命令來執(zhí)行此操作。grep
命令的基本語法是匹配器(例如搜索詞)和搜索空間(例如一個或多個文件)。
grep 'Josh .*' names.txt
Josh Brener
Josh Chang
在上面的示例中,grep
將匹配在文件 names.txt 中,以單詞“Josh”開頭,后跟一個空格字符的任意字符組合的行。
sed
sed
也是一種基于行的工具,最常用于將指定文件中出現(xiàn)的一組字符替換為另一組字符。下面例子是在文件中用“JOSH”替換所有出現(xiàn)的“Josh”這個詞。
sed 's/Josh/JOSH/' names.txt
JOSH Brener
JOSH Chang
現(xiàn)在假設我們想從 grep
示例中獲取我們的名稱列表并對其進行操作,以便名稱采用 Last, First 格式。我們可以用 sed
來做到這一點,用括號將匹配器的部分括起來,以便記住它們以備后用。
sed 's/\(.*\) \(.*\)/\2, \1/' names.txt
我們將第一個 .* 匹配器括在括號中以記住空格字符之前的字符序列,然后用第二組括號記住空格之后的所有字符。我們在命令的替換部分重放它們,/1 表示第一個記住的模式,/2 作為我們的第二個記住的模式。
Nanjiani, Kumail
Middleditch, Thomas
Crew, Amanda
Brener, Josh
Miller, T.J.
Woods, Zach
Starr, Martin
Chang, Josh
結合 grep 和 sed
grep
和 sed
的真正強大之處在于結合了 grep
的行匹配和 sed
的替換功能。所以在我們之前的名字示例中,如果我們想搜索一個文件,只獲取名字是 Josh 的人,然后將它們格式化為 Last, First,我們可以獲取 grep
命令的輸出并將其用作 sed
的輸入帶有 UNIX 管道字符的命令。
grep '^Josh .*$' names.txt | sed 's/\(.*\) \(.*\)/\2, \1/'
Brener, Josh
Chang, Josh
關于正則表達式的說明
grep
和 sed
都使用正則表達式(簡稱 regex)來定義要匹配的字符序列,以及如何匹配它們的規(guī)則。
編寫正則表達式匹配器本身就是一門學科,但在某種程度上肯定是一項技能??梢栽诒疚闹姓业接嘘P正則表達式的更多信息,Linux修改文件內容命令sed對特殊字符的寫法。