正则表达式 sed
简介
正则表达式(regular expression)是一个强大的文本处理工具,是各种文本编辑器和编程语言中经常使用的基本工具之一。在文本处理中,正则表达式可以帮助用户通过匹配特定模式的字符来实现文本的查找、筛选、替换等操作。
Sed是一种非常流行的文本处理工具,常用于在Linux系统上对文件进行处理。Sed可以读取一个或多个输入文件,对其执行各种编辑操作,并将结果输出到标准输出或另一个文件中。
在Sed中,正则表达式被广泛使用,通过使用正则表达式,用户可以实现文本的各种处理操作,如查找、替换、删除等。
常见正则表达式语法
正则表达式中最常见的语法符号是通配符,用于匹配任意字符。在Sed中,常见的通配符有:
| 符号 | 描述 |
|---|---|
| . | 匹配任意单个字符,但不包括换行符(\n) |
| * | 匹配零个或多个前面的字符 |
| + | 匹配一个或多个前面的字符 |
| ? | 匹配零个或一个前面的字符 |
另外,正则表达式中还有一些特殊字符需要进行转义才能进行匹配,常见的特殊字符包括:
| 符号 | 描述 |
|---|---|
| ^ | 匹配字符串的开头,如果在方括号中使用,则表示取反操作 |
| $ | 匹配字符串的结尾 |
| \ | 转义字符,用于匹配特殊字符 |
| [] | 匹配方括号内的任意一个字符 |
| [^] | 匹配方括号内除了指定字符以外的任意一个字符 |
| () | 分组,在分组中的字符被视为一个整体 |
| | | 或,匹配“|”两边的任意一个字符串 |
| {} | 用于限定重复次数 |
| \d | 匹配数字 |
| \s | 匹配任意空白字符(空格、制表符等) |
| \w | 匹配任意单词字符(字母、数字、下划线等) |
例如,使用通配符.匹配任意字符:
echo "hello,world" | sed 's/./+/g'
输出结果为+++++++++++,表示将"hello,world"中的每一个字符都被替换成了+。
又如,使用转义字符\匹配特殊字符:
echo "the [quick brown] fox jumps over the lazy dog" | sed 's/\[.*\]//g'
输出结果为the fox jumps over the lazy dog,表示将"the [quick brown] fox jumps over the lazy dog"中的方括号[]及其中的内容全部删除。
Sed正则表达式的使用
在Sed中,正则表达式通常用于查找和替换文本中的特定字符或字符串。 Sed使用的正则表达式语法大多数是基于Unix的正则表达式(BRE),但它仍然支持扩展的正则表达式(ERE),以及GNU扩展正则表达式(ERE)。
Sed查找操作
在Sed中,查找特定字符串或字符的方式是使用s命令(substitute的缩写),语法格式为:
sed 's/要查找的字符/要替换的字符/g' 文件名
其中,s表示Substitute(替换)命令,/用于分隔要查找和替换的字符串,g表示全局匹配,表示将文件中所有符合正则表达式的字符串都进行替换。
例如,查找文件test.txt中所有的foo字符串,并将其替换成bar字符串:
sed 's/foo/bar/g' test.txt
文件test.txt中的内容如下:
foo
foo bar
bar foobar
执行以上命令后,输出结果为:
bar
bar bar
bar barbar
可以看到,foo被替换成了bar,所有符合正则表达式的字符串都被替换了。
Sed删除操作
在Sed中,可以使用正则表达式删除文件中所有符合条件的字符串。删除操作使用的是d命令,语法格式为:
sed '/正则表达式/d' 文件名
例如,删除所有以数字开始的行:
sed '/^[0-9]/d' test.txt
文件test.txt中的内容如下:
1 foo
foo bar
2 bar foobar
执行以上命令后,输出结果为:
foo bar
可以看到,所有以数字开始的行都被删除了。
Sed插入和追加操作
在Sed中,可以使用正则表达式对文件中的内容进行插入和追加操作。插入操作使用的是i命令,追加操作使用的是a命令,语法格式都相同:
sed '/正则表达式/i\ 要插入或追加的内容' 文件名
例如,在所有以数字开始的行之前插入一行Start:
sed '/^[0-9]/i\Start' test.txt
文件test.txt中的内容如下:
1 foo
foo bar
2 bar foobar
执行以上命令后,输出结果为:
Start
1 foo
foo bar
Start
2 bar foobar
可以看到,在所有以数字开始的行之前插入了一行Start。
Sed替换行操作
在Sed中,可以使用正则表达式进行行替换操作,将符合正则表达式的一行替换成指定的内容。行替换操作使用c命令,语法格式如下:
sed '/正则表达式/c\ 要替换的内容' 文件名
例如,将文件中以数字开始的行替换成This is a number:
sed '/^[0-9]/c\ This is a number' test.txt
文件test.txt中的内容如下:
1 foo
foo bar
2 bar foobar
执行以上命令后,输出结果为:
This is a number
foo bar
This is a number
可以看到,所有以数字开始的行都被替换成了This is a number。
Sed常用选项
在使用Sed进行操作时,还可以使用一些常用选项来指定编辑操作的方式和范围。常用选项如下:
| 选项 | 描述 |
|---|---|
| -e | 执行多个编辑操作 |
| -f | 从指定文件中读取编辑操作 |
| -i | 直接修改指定文件 |
| -n | 禁止默认输出 |
| -r | 支持扩展正则表达式 |
| -s | 对每行只执行一次替换操作,而不是全局替换操作 |
例如,执行多个编辑操作:
sed -e 's/foo/bar/' -e 's/bar/baz/' test.txt
执行以上命令后,文件test.txt中的内容如下:
baz
baz bazoo
baz bazoofoobar
可以看到,foo被替换成了bar,bar被替换成了baz。
又如,直接修改文件:
sed -i 's/foo/bar/g' test.txt
执行以上命令后,文件test.txt中的内容被修改为:
bar
bar bazoo
bar bazoo barbar
可以看到,所有符合正则表达式的字符串都被替换成了bar。
结论
使用正则表达式可以帮助我们快速、高效地处理文本文件。Sed作为一种强大的文本编辑工具,在Linux系统下广泛使用,熟练掌握Sed的正则表达式语法和常用选项,可以大大提高文本处理效率。
在使用Sed进行文本处理时,需要注意,正则表达式的书写需要较高的技巧和经验,需要不断的实践和学习才能熟练掌握。
极客笔记