当我使用Linux命令行时,无论是在桌面上编写新程序还是在Web服务器上管理网站,我都经常需要处理文本文件。Linux提供了我可以用来完成工作的强大工具。我经常使用sed,这是一种根据模式修改文本的编辑器。sed代表StreamEditor,它编辑文件中的文本并打印结果。使用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,程序EmulatedConway的《生命游戏》:.PHONY:全部运行cleanall:game:game.o$(CC)$(CFLAGS)-ogamegame.o$(LDFLAGS)run:game./gameclean:$(RM)*~$(RM)*.o$(RM)gamegame这个名字不太形象,所以我觉得改名为life。将game.c源文件重命名为life.c很容易,但现在我需要修改Makefile以使用新名称。我可以使用sed将所有游戏更改为生活:$sed-e's/game/life/g'Makefile.PHONY:allruncleanall:lifelife:life.o$(CC)$(CFLAGS)-olifelife。o$(LDFLAGS)run:life./lifeclean:$(RM)*~$(RM)*.o$(RM)lifesed将输出打印到屏幕,这是检查文本替换是否符合的好方法你问。要对Makefile进行这些更改,首先,备份文件,然后运行??sed并将输出保存为原始文件名:$cpMakefileMakefile.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$lsMakefile*MakefileMakefile.old在Linux上使用sed来引用文件你可以使用正则表达式其他函数来匹配特定的文本实例。例如,您可能需要替换出现在行首的文本。使用sed,您可以使用插入符^来匹配行的开头。我使用“行首”替换文本的一种方法是当我需要在电子邮件中引用文件时。假设我想在电子邮件中共享我的Makefile,但我不想将其作为文件附件包含在内。相反,我更喜欢在电子邮件文本中“引用”文件,在每一行之前使用>。我可以将编辑后的版本打印到我的终端,然后使用以下sed命令将其复制粘贴到新电子邮件中:$sed-e's/^/>/'Makefile>.PHONY:allrunclean>>all:life>>life:life.o>$(CC)$(CFLAGS)-olifelife.o$(LDFLAGS)>>运行:life>./life>>clean:>$(RM)*~>$(RM)*.o>$(RM)lives/^/>/正则表达式匹配每行的开头(^)并在此处放置一个>。实际上,这相当于每行以>符号开头。标签可能无法在电子邮件中正确显示,但我可以通过添加另一个正则表达式将Makefile中的所有标签替换为几个空格:$sed-e's/^/>/'-e's/\t//g'Makefile>.PHONY:allrunclean>>all:life>>life:life.o>$(CC)$(CFLAGS)-olifelife.o$(LDFLAGS)>>run:life>./life>>clean:>$(RM)*~>$(RM)*.o>$(RM)life\t表示一个文字tab,所以s/\t//g告诉sed将input中的所有tab替换成两个输出中的空格。如果需要对文件进行大量编辑,可以将-e命令保存在文件中,并使用-f选项告诉sed将该文件用作“脚本”。如果您需要经常进行相同的编辑,此方法特别有用。我已经准备好quotemail.sed的脚本文件以在我的电子邮件中引用Makefile:$catquotemail.seds/^/>/s/\t//g$sed-fquotemail.sedMakefile>.PHONY:allrunclean>>all:life>>life:life.o>$(CC)$(CFLAGS)-olifelife.o$(LDFLAGS)>>run:life>./life>>clean:>$(RM)*~>$(RM)*.o>$(RM)life学习在Linux上使用sedsed是一个很好的工具,可以保留在您的Linux命令行工具包中。浏览sed手册页并了解有关如何使用它的更多信息。在命令行中键入mansed以获得有关不同命令行选项的完整文档,以及如何使用sed处理文本文件。
