如何使用 Linux sed 命令自動進行文件編輯
以下是從 Linux 命令行自動編輯文件的一些提示和技巧。
當我使用 Linux 命令行時,無論是在台式機上編寫新程序還是在 Web 伺服器上管理網站,我經常需要處理文本文件。Linux 提供了強大的工具,我可以利用這些工具來完成我的工作。我經常使用 sed
,一個可以根據模式修改文本的編輯器。
sed
代表 流編輯器 ,它編輯文件中的文本並列印結果。使用 sed
的一種方法是識別一個字元串在文件中的幾次出現,並將它們替換為不同的字元串。使用 sed
來處理文本文件的方式似乎是無窮無盡的,但我想分享一些使用 sed
來幫助我管理文件的方法。
在 Linux 上搜索和替換文件中的文本
要使用 sed
,你需要使用一個正則表達式。正則表達式是定義模式的一組特殊字元。我最常使用 sed
的例子是替換文件中的文本。替換文本的語法如下:s/originaltext/newtext
。s
告訴 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: https://opensource.com/article/22/8/automate-file-edits-sed-linux
作者:Jim Hall 選題:lkxed 譯者:perfiffer 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive