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

126 阅读4分钟

当我使用Linux命令行时,无论是在我的台式电脑上编写一个新程序,还是在我的网络服务器上管理一个网站,我经常需要处理文本文件。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,它模拟Conway的生命游戏。

.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