如何使用 Linux sed 命令自動進行文件編輯 | Linux 中國
以下是從 Linux 命令行自動編輯文件的一些提示和技巧。
- 來源: http:// linux.cn/article-14938- 1.html
- 作者:Jim Hall
- 譯者:perfiffer
(本文字數:4086,閲讀時長大約:5 分鐘)
以下是從 Linux 命令行自動編輯文件的一些提示和技巧。
當我使用 Linux 命令行時,無論是在台式機上編寫新程序還是在 Web 服務器上管理網站,我經常需要處理文本文件。Linux 提供了強大的工具,我可以利用這些工具來完成我的工作。我經常使用 sed
,一個可以根據模式修改文本的編輯器。
sed
代表 流編輯器(Stream EDitor)
,它編輯文件中的文本並打印結果。使用 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: http:// opensource.com/article/ 22/8/automate-file-edits-sed-linux
作者:Jim Hall 選題: lkxed 譯者: perfiffer 校對: wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
- 技術乾貨丨攝像頭管理功能架構,EdgeX ONVIF/USB 管理和推理平台
- 大模型時代,那些一起訓練AI模型的企業是怎麼應對數據顧慮的?
- 一位小白踏入Linux內核補丁提交大門的真實體驗
- 如何使用 Linux sed 命令自動進行文件編輯 | Linux 中國
- 新的 PyPI 包提供無文件 Linux 惡意軟件
- 手寫了個操作系統
- 【雲原生】快速瞭解Kubernetes
- 用 MAUI 在Windows 和 Linux 繪製 PPT 圖表
- Linux—磁盤管理
- 修復 Linux 上的文件權限錯誤 | Linux 中國
- 一文讀懂 | Linux系統啟動過程
- Docker如何鏡像加速
- 如何使用 LibreOffice Writer 模板 | Linux 中國
- 為什麼 Fedora 一開始允許使用 CC0 許可證 | Linux 中國
- 越折騰越好用的 3 款開源 APP
- 61秒,摸透Linux的健康狀態!
- Padloc:一個直觀的開源密碼管理器 | Linux 中國
- 淺議 Firefox 多賬户容器 | Linux 中國
- 針對Windows和Linux ESXi服務器,GwisinLocker勒索軟件發起勒索攻擊
- 修復 Ubuntu 中的 “Pending Update of Firefox snap” 錯誤 | Linux 中國