如何使用 Linux sed 命令自動進行文件編輯
當(dāng)我使用 Linux 命令行時,無論是在臺式機上編寫新程序還是在 Web 服務(wù)器上管理網(wǎng)站,我經(jīng)常需要處理文本文件。Linux 提供了強大的工具,我可以利用這些工具來完成我的工作。我經(jīng)常使用 sed,一個可以根據(jù)模式修改文本的編輯器。
sed? 代表 流編輯器,它編輯文件中的文本并打印結(jié)果。使用 sed? 的一種方法是識別一個字符串在文件中的幾次出現(xiàn),并將它們替換為不同的字符串。使用 sed? 來處理文本文件的方式似乎是無窮無盡的,但我想分享一些使用 sed 來幫助我管理文件的方法。
在 Linux 上搜索和替換文件中的文本
要使用 sed?,你需要使用一個正則表達式。正則表達式是定義模式的一組特殊字符。我最常使用 sed? 的例子是替換文件中的文本。替換文本的語法如下:s/originaltext/newtext。s? 告訴 sed 執(zhí)行文本替換或交換出現(xiàn)的文本。在斜線之間提供原始文本和新文本。
此語法將僅替換每行中第一次出現(xiàn)的 originaltext?。要替換每個匹配項,即使在一行中原始文本出現(xiàn)了不止一次,要將 g? 追加到表達式的末尾。例如:s/originaltext/newtext/g。
要在 sed? 中使用此表達式,請使用 -e 選項指定此正則表達式:
$ sed -e 's/originaltext/newtext/g'
例如,假設(shè)我有一個名為 game 程序的 Makefile 文件,該程序模擬了康威的《生命游戲》:
.PHONY: all run clean
all: game
game: game.o
$(CC) $(CFLAGS) -o game game.o $(LDFLAGS)
run: game
./game
clean:
$(RM) *~
$(RM) *.o
$(RM) game
game? 這個名字并不是很有描述性,所以我想會把它改名為 life?。將 game.c? 源文件重命名為 life.c? 非常簡單,但現(xiàn)在我需要修改 Makefile 以使用新名稱。我可以使用 sed? 來將所有的 game? 更改為 life:
$ sed -e 's/game/life/g' Makefile
.PHONY: all run clean
all: life
life: life.o
$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
run: life
./life
clean:
$(RM) *~
$(RM) *.o
$(RM) life
sed? 會將輸出打印到屏幕上,這是檢查文本替換是否符合你要求的好方法。要對 Makefile 進行這些更改,首先,備份文件,然后運行 sed 并將輸出保存到原始文件名:
$ cp Makefile Makefile.old
$ sed -e 's/game/life/g' Makefile.old > Makefile
如果你確信你的更改正是你想要的,請使用 -i? 或 --in-place? 選項來編輯文件。但是,我建議添加一個備份文件后綴,如 --in-place=.old,用來備份原始文件,以備日后需要恢復(fù)時使用。它看起來像這樣:
$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile Makefile.old
在 Linux 上使用 sed 引用文件
你可以使用正則表達式的其它功能來匹配特定的文本實例。例如,你可能需要替換出現(xiàn)在行首的文本。使用 sed?,你可以用上尖號 ^ 來匹配行的開頭。
我使用“行首”來替換文本的一種方式是當(dāng)我需要在電子郵件中引用一個文件時。假設(shè)我想在電子郵件中共享我的 Makefile,但我不想將其作為文件附件包含在內(nèi)。相反,我更喜歡在電子郵件正文中“引用”文件,在每行之前使用 >?。我可以使用以下 sed 命令將編輯后的版本打印到我的終端,并將其復(fù)制粘貼到新的電子郵件中:
$ sed -e 's/^/>/' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
s/^/>/? 正則表達式匹配每行的開頭(^?),并在那里放置一個 >?。實際上,這相當(dāng)于每行都以 > 符號開始。
制表符可能無法在電子郵件中正確顯示,但我可以通過添加另一個正則表達式將 Makefile 中的所有制表符替換為幾個空格:
$ sed -e 's/^/>/' -e 's/\t/ /g' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
\t? 表示文字制表符,因此 s/\t/ /g? 告訴 sed 用輸出中的兩個空格替換輸入中的所有制表符。
如果你需要對文件進行大量編輯,你可以將 -e? 命令保存在文件中,并使用 -f? 選項來告訴 sed? 將該文件用作“腳本”。如果你需要經(jīng)常進行相同的編輯,這種方法特別有用。我已經(jīng)準備了 quotemail.sed 的腳本文件來在我的電子郵件中引用 Makefile:
$ cat quotemail.sed
s/^/>/
s/\t/ /g
$ sed -f quotemail.sed Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
學(xué)習(xí)在 Linux 上使用 sed
sed? 是一個很好的工具,可以保存在你的 Linux 命令行工具包中。瀏覽 sed? 手冊頁并了解有關(guān)如何使用它的更多信息。在命令行中鍵入 man sed? 以獲取有關(guān)不同命令行選項的完整文檔,以及如何使用 sed 處理文本文件。