Unix/Linux - 使用SED进行正则表达式

你好,未来的命令行魔法师们!今天,我们将深入到正则表达式(regex)和Unix/Linux中强大的SED命令的神奇世界。系好安全带,因为我们即将开始一段激动人心的冒险,这将改变你操作文本的方式!

Unix / Linux - Regular Expressions

调用sed

让我们从基础开始。SED,代表“流编辑器”,是一个强大的文本处理工具。要使用它,我们只需输入“sed”然后跟上我们的命令。这就像召唤一个文本操作的精灵!

sed '命令' 文件名

例如:

sed 's/hello/bonjour/' greetings.txt

这个命令将greetings.txt文件中的“hello”替换为“bonjour”。简单吧?

sed的一般语法

sed的一般语法就像一个魔法咒语:

sed 选项... [脚本] [输入文件...]

别担心这个看起来令人畏惧。我们会一步步分解,就像解一个有趣的谜题!

使用sed删除所有行

想要让一个文件中的所有文本消失?sed可以做到!下面是如何操作:

sed 'd' 文件名

这将删除文件中的所有行。就像在数字笔记本上使用橡皮擦!

sed的地址

sed中的地址就像文本的GPS坐标。它们告诉sed在哪里施展魔法。以下是一些示例:

sed '2d' 文件.txt  # 删除第2行
sed '/模式/d' 文件.txt  # 删除包含'模式'的行

sed的地址范围

有时,我们想要在一系列行上施法。下面是如何操作:

sed '2,5d' 文件.txt  # 删除第2到第5行
sed '2,$d' 文件.txt  # 从第2行删除到文件末尾

替换命令

替换命令是sed的核心。它就像是“查找并替换”的加强版!

sed 's/旧/新/' 文件.txt

这会替换每行中第一次出现的“旧”为“新”。

替换标志

标志就像是替换命令的增强道具。以下是一些常见的标志:

标志 描述
g 替换所有出现,而不仅仅是第一个
i 忽略大小写
p 打印修改后的行
w 将结果写入文件

示例:

sed 's/cat/dog/g' pets.txt

这将替换文件中所有的“cat”为“dog”。

使用替代字符串分隔符

有时,你的文本包含很多斜杠。别担心!我们可以使用不同的分隔符:

sed 's#/usr/local/bin#/common/bin#' 路径.txt

这里,我们使用'#'作为分隔符,而不是'/'。

使用空格替换

想要让文本消失得无影无踪?下面是如何操作:

sed 's/不需要的//g' 文件.txt

这将删除文件中所有的“不需要的”。

地址替换

我们可以结合地址和替换进行精确的文本编辑:

sed '3,6s/foo/bar/g' 文件.txt

这会将第3到第6行中的所有“foo”替换为“bar”。

匹配命令

匹配命令就像一束聚光灯,照亮我们感兴趣的行:

sed -n '/模式/p' 文件.txt

这将只打印包含“模式”的行。

使用正则表达式

现在我们来到了真正的魔法领域!正则表达式就像是超级通配符。以下是一个简单的例子:

sed -n '/^The/p' story.txt

这将打印所有以“The”开头的行。

匹配字符

正则表达式有特殊的字符,它们就像变形者:

字符 含义
. 任何单个字符
* 前一个字符的零个或多个
^ 行的开始
$ 行的结束

示例:

sed -n '/c.t/p' animals.txt

这将匹配“cat”、“cot”、“cut”等。

字符类关键字

字符类就像一组字符的团队。以下是一些MVP成员:

匹配
[:alpha:] 字母字符
[:digit:] 数字字符
[:alnum:] 字母数字字符

示例:

sed -n '/[[:digit:]]/p' data.txt

这将打印包含任何数字的行。

使用与引用

与号(&)就像一个魔镜,反射匹配的内容:

sed 's/[0-9]/(&)/' numbers.txt

这将把每个数字放入括号中。

使用多个sed命令

想要一次施放多个咒语?使用-e选项:

sed -e 's/foo/bar/g' -e 's/baz/qux/g' 文件.txt

这将一次性执行两个替换!

反向引用

反向引用就像时间机器,允许我们重用匹配的部分:

sed 's/\(.*\):\([^:]*\)/\2:\1/' names.txt

这将交换冒号前后文本的位置。

至此,亲爱的学生们,我们已经穿越了sed和正则表达式的土地。记住,熟能生巧。所以,勇往直前,像正在成为的命令行巫师一样操作文本吧!快乐编码!

Credits: Image by storyset