当我使用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