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