如何使用 Linux sed 命令自動進行文件編輯 | Linux 中國

語言: CN / TW / HK

以下是從 Linux 命令行自動編輯文件的一些提示和技巧。

(本文字數:4086,閲讀時長大約:5 分鐘)

以下是從 Linux 命令行自動編輯文件的一些提示和技巧。

當我使用 Linux 命令行時,無論是在台式機上編寫新程序還是在 Web 服務器上管理網站,我經常需要處理文本文件。Linux 提供了強大的工具,我可以利用這些工具來完成我的工作。我經常使用 sed ,一個可以根據模式修改文本的編輯器。

sed 代表 流編輯器(Stream EDitor) ,它編輯文件中的文本並打印結果。使用 sed 的一種方法是識別一個字符串在文件中的幾次出現,並將它們替換為不同的字符串。使用 sed 來處理文本文件的方式似乎是無窮無盡的,但我想分享一些使用 sed 來幫助我管理文件的方法。

在 Linux 上搜索和替換文件中的文本

要使用 sed ,你需要使用一個 正則表達式 。正則表達式是定義模式的一組特殊字符。我最常使用 sed 的例子是替換文件中的文本。替換文本的語法如下: s/originaltext/newtexts 吿訴 sed 執行文本替換或交換出現的文本。在斜線之間提供原始文本和新文本。

此語法將僅替換每行中第一次出現的 originaltext 。要替換每個匹配項,即使在一行中原始文本出現了不止一次,要將 g 追加到表達式的末尾。例如: s/originaltext/newtext/g

要在 sed 中使用此表達式,請使用 -e 選項指定此正則表達式:

$ sed -e 's/originaltext/newtext/g'

例如,假設我有一個名為 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 非常簡單,但現在我需要修改 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 ,用來備份原始文件,以備日後需要恢復時使用。它看起來像這樣:

$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile  Makefile.old

在 Linux 上使用 sed 引用文件

你可以使用正則表達式的其它功能來匹配特定的文本實例。例如,你可能需要替換出現在行首的文本。使用 sed ,你可以用上尖號 ^ 來匹配行的開頭。

我使用“行首”來替換文本的一種方式是當我需要在電子郵件中引用一個文件時。假設我想在電子郵件中共享我的 Makefile,但我不想將其作為文件附件包含在內。相反,我更喜歡在電子郵件正文中“引用”文件,在每行之前使用 > 。我可以使用以下 sed 命令將編輯後的版本打印到我的終端,並將其複製粘貼到新的電子郵件中:

$ 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/^/>/ 正則表達式匹配每行的開頭( ^ ),並在那裏放置一個 > 。實際上,這相當於每行都以 > 符號開始。

製表符可能無法在電子郵件中正確顯示,但我可以通過添加另一個正則表達式將 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 將該文件用作“腳本”。如果你需要經常進行相同的編輯,這種方法特別有用。我已經準備了 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

學習在 Linux 上使用 sed

sed 是一個很好的工具,可以保存在你的 Linux 命令行工具包中。瀏覽 sed 手冊頁並瞭解有關如何使用它的更多信息。在命令行中鍵入 man sed 以獲取有關不同命令行選項的完整文檔,以及如何使用 sed 處理文本文件。

via: http:// opensource.com/article/ 22/8/automate-file-edits-sed-linux

作者:Jim Hall 選題: lkxed 譯者: perfiffer 校對: wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出