| 会员登录 立即注册

打印 上一主题 下一主题

如何使用 Linux sed 命令自动进行文件编辑

[复制链接]
跳转到指定楼层
楼主
3AAA 发表于 2022-8-18 09:22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主
3AAA
2022-8-18 09:22:27 3265 3 看楼主


以下是从 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 cleanall: gamegame: game.o        $(CC) $(CFLAGS) -o game game.o $(LDFLAGS)run: game        ./gameclean:        $(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 cleanall: lifelife: life.o        $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)run: life        ./lifeclean:        $(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.seds/^/>/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中国荣誉推出
回复

使用道具 举报

沙发
阴桃淋丸子 发表于 2022-8-18 09:23:20 | 只看该作者
沙发
阴桃淋丸子
2022-8-18 09:23:20 看楼主
转发了
回复 支持 反对

使用道具 举报

板凳
zhengtse 发表于 2022-8-18 09:25:13 | 只看该作者
板凳
zhengtse
2022-8-18 09:25:13 看楼主
转发了
回复 支持 反对

使用道具 举报

地板
卞笑笑 发表于 2022-8-18 09:26:16 | 只看该作者
地板
卞笑笑
2022-8-18 09:26:16 看楼主
转发了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

3AAA 当前离线
白银会员

查看:3265 | 回复:3

关于我们  |   侵权投诉受理  |   联系我们  |   Archiver  |  
免责声明:邳州信息网所有言论只代表发表者个人观点,与本站无关
Copyright © 2009-2025 pzxxw.com 版权所有:邳州金银杏文化传媒有限公司  

苏公网安备 32038202000401号

快速回复 返回顶部 返回列表