如何使用 Linux sed 命令自动进行文件编辑
创始人
2024-03-02 12:01:35
0

以下是从 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: https://opensource.com/article/22/8/automate-file-edits-sed-linux

作者:Jim Hall 选题:lkxed 译者:perfiffer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

统一VLA范式!港科大开源...
新智元报道 编辑:LRST 【新智元导读】当前具身智能的VLA(...
2026-04-13 13:51:15
AI驱动需求增长,三星NA...
来源:环球网 【环球网科技综合报道】3月8日消息,据韩国媒体韩媒...
2026-03-08 20:36:09
腾讯混元AI Infra核...
新榜讯 2月4日消息,腾讯混元AI Infra团队今日正式推出开源...
2026-02-05 10:18:57
语法正确,疑似AI:人工智...
一、“AI起号速成班” AI拥有近乎零门槛的强大文本生成能力,正被...
2026-01-25 13:20:01
Adobe Firefly...
环球网 12月17日消息,创意软件公司 Adobe 宣布为其人工智...
2026-01-20 11:26:56
开源≠无条件免费:Coze...
原来我对开源协议的理解还是不够深,Coze开源才让我明白目前的几个...
2025-07-30 08:13:44

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...