Linux正则表达式以及Sed使用学习
正则表达式是熟悉和使用Linux系统的最重要的基础,其中grep,find,awk以及sed等对其依赖更大。本节将总结一下Linux中常用的正则表达式使用方法。
正则表达式中特殊字符
- . : 表示任何单个字符
- [] : 包含一个字符序列,表示匹配序列中其中一个字符
- - : 出现在[]中,表示一个序列范围.如[a-z]表示26个小写的英文字母
- ^ : 出现在[]中,表示对序列去反。如[^a-z]表示匹配不是a-z的其他字符
- * : 匹配某一个字符的0个或1个或多个实例
- ? : 匹配某一个字符的0个或1个实例
- + : 匹配某一个字符的1个或多个实例
- $ : 匹配行尾。如test$指匹配以test结尾的行
- ^ : 匹配行首。如^test指匹配以test开始的行
- \< : 匹配词首
- > : 匹配词尾
- \ : 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义
sed使用说明
sed命令:
1
| sed [OPTION]... {script-only-if-no-other-script} [input-file]...
|
sed使用
data文件内容
1 2 3 4
| this is a dog a this is a cat this is a money this is a fish
|
用s命令进行替换
替换时若出现单引号,直接将脚本用双引号括起来即可。
1.将一行中第一个匹配的特定字符串替换
注意不会改变原文件,只是会打印到标准输出流。若要保存可以重定向到新的文件中。
2.讲一行中所有匹配的特定字符串匹配,使用g参数
3.使用-i参数直接修改文件内容
4.在每一行的开头添加内容
5.在每一行的结尾添加内容
6.指定特定行替换,或指定特定范围内的行替换
1 2
| sed "3s/an/a/" data sed "1,2s/an/a/" data
|
7.只替换每一行的第一个a:
8.只替换每一行的第二个a:
9.只替换每一行第二个以后的所有a
多个匹配
多个匹配可以用分好将匹配规则连接。
1
| sed "s/an/a/g;s/dog/cat/g" data
|
上述命令等价于:
1
| sed -e "s/an/a/g" -e "s/dog/cat/g" data
|
显示被匹配的变量
&可以表示被匹配的变量,即若被匹配的变量为”abc”,则&代表abc。
1 2
| #功能为在每个an外加[] sed -e "s/an/[&]/g" data
|
圆括号匹配
被圆括号括起来的匹配可以当做变量使用,注意圆括号匹配时括号需要”\”转义。变量按顺序使用\1,\2指代。
1
| sed "s/this \(.*\) an \(.*\)/\1:\2/" data
|
结果:
1 2 3 4
| is:dog an is:cant is:money is:fish
|
sed命令
data内容:
1 2 3 4
| this is a dog a this is a cat this is a money this is a fish
|
N命令
N命令的作用是把下一行的命令纳入当做缓冲区。也就是缓冲区包括两行.
1 2
| #只匹配缓冲区的第一个this sed "N;s/this/that/" data
|
执行命令结果为:
1 2 3 4
| that is a dog a this is a cat that is a money this is a fish
|
执行命令结果为:
1 2
| this is a dog a,this is a cat this is a money,this is a fish
|
a命令和i命令
i命令的作用是在指定行前面插入一行,行号写在i前面,中间空格可有可无;如果不写行号默认在所有行的前面插入
1 2
| #在第一行前面插入 this is my test i sed "1i this is my test i" data
|
a命令的作用是在指定行后追加内容,行号写在a前面,若不写表示所有行后。也可用$代表最后一行,不过一定要有空格.
1 2
| #在第一行后插入 this is my test a sed "1a this is my test a" data
|
- 可以使用匹配来添加
1 2
| #若匹配到cat,则在当前行后追加一行 this is test match a sed "/cat/a this is test match a" data
|
c命令
c命令是替换匹配的行
1 2
| #替换第二行 sed "2 c this is test c" data
|
结果:
1 2 3 4
| this is a dog a this is test c this is a money this is a fish
|
1 2
| #用匹配替换 sed "/fish/c this is the test c" data
|
结果:
1 2 3 4
| this is a dog a this is a cat this is a money this is the test c
|
d命令
d命令删除指定的行,可指定范围
1 2
| #删除第2到3行 sed "2,3 d" data
|
结果:
1 2
| this is a dog a this is a fish
|
1 2
| #删除找到cat指定的行 sed "/cat/d" data
|
结果:
1 2 3
| this is a dog a this is a money this is a fish
|
1 2
| #删除第二行到结尾 sed "2,$ d" data
|
结果:
p命令
p命令的作用是打印匹配到的行.注意打印的时候使用-n参数。sed默认输出处理后的文本,使用-n参数阻止默认输出。
1 2
| #打印匹配到cat的行 sed -n "/cat/p" data
|
1 2
| #打印符合从一个模式当另一个模式的行 sed -n "/dog/,/money/p" data
|
结果:
1 2 3
| this is a dog a this is a cat this is a money
|
1 2
| #打印从第一行到匹配到的哪一行 sed -n "1,/cat/p" data
|
结果:
1 2
| this is a dog a this is a cat
|
=命令
=参数用于打印匹配到的行号
1 2
| #打印含有cat的行号 sed -n "/cat/=" data
|
综合运用
将下列中所有的100替换为当前行号
1 2 3 4 5 6 7 8 9 10 11 12 13
| hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100 hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
|
shell命令如下:
1
| sed = data | sed "N;s/\([0-9]*\)\n\(hmset '99_p_\)[0-9]*\(' 'm_19' \)[0-9]*\( 't_19' \)[0-9]*\( 'semm_19' \)[0-9]*/\2\1\3\1\4\1\5\1/"
|
结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| hmset '99_p_1' 'm_19' 1 't_19' 1 'semm_19' 1 hmset '99_p_2' 'm_19' 2 't_19' 2 'semm_19' 2 hmset '99_p_3' 'm_19' 3 't_19' 3 'semm_19' 3 hmset '99_p_4' 'm_19' 4 't_19' 4 'semm_19' 4 hmset '99_p_5' 'm_19' 5 't_19' 5 'semm_19' 5 hmset '99_p_6' 'm_19' 6 't_19' 6 'semm_19' 6 hmset '99_p_7' 'm_19' 7 't_19' 7 'semm_19' 7 hmset '99_p_8' 'm_19' 8 't_19' 8 'semm_19' 8 hmset '99_p_9' 'm_19' 9 't_19' 9 'semm_19' 9 hmset '99_p_10' 'm_19' 10 't_19' 10 'semm_19' 10 hmset '99_p_11' 'm_19' 11 't_19' 11 'semm_19' 11 hmset '99_p_12' 'm_19' 12 't_19' 12 'semm_19' 12 hmset '99_p_13' 'm_19' 13 't_19' 13 'semm_19' 13
|