Linux正则表达式以及Sed使用学习

博客搬家,原地址:https://langzi989.github.io/2017/08/20/Linux正则表达式/

正则表达式是熟悉和使用Linux系统的最重要的基础,其中grep,find,awk以及sed等对其依赖更大。本节将总结一下Linux中常用的正则表达式使用方法。

正则表达式中特殊字符

  • . : 表示任何单个字符
  • [] : 包含一个字符序列,表示匹配序列中其中一个字符
  • - : 出现在[]中,表示一个序列范围.如[a-z]表示26个小写的英文字母
  • ^ : 出现在[]中,表示对序列去反。如[^a-z]表示匹配不是a-z的其他字符
  • * : 匹配某一个字符的0个或1个或多个实例
  • ? : 匹配某一个字符的0个或1个实例
  • + : 匹配某一个字符的1个或多个实例
  • $ : 匹配行尾。如test$指匹配以test结尾的行
  • ^ : 匹配行首。如^test指匹配以test开始的行
  • < : 匹配词首
  • > : 匹配词尾
  • \ : 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义

sed使用说明

sed命令:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed使用

data文件内容

this is a dog a
this is a cat
this is a money
this is a fish
用s命令进行替换

替换时若出现单引号,直接将脚本用双引号括起来即可。
1.将一行中第一个匹配的特定字符串替换

sed "s/a/an/" data

注意不会改变原文件,只是会打印到标准输出流。若要保存可以重定向到新的文件中。

2.讲一行中所有匹配的特定字符串匹配,使用g参数

sed "s/a/an/g" data

3.使用-i参数直接修改文件内容

sed -i "s/a/an/g" data

4.在每一行的开头添加内容

sed "s/^/#/" data

5.在每一行的结尾添加内容

sed "s/$/#/" data

6.指定特定行替换,或指定特定范围内的行替换

sed "3s/an/a/" data
sed "1,2s/an/a/" data

7.只替换每一行的第一个a:

sed "s/a/an/1" data

8.只替换每一行的第二个a:

sed "s/a/an/2" data

9.只替换每一行第二个以后的所有a

sed "s/a/an/2g" data
多个匹配

多个匹配可以用分好将匹配规则连接。

sed "s/an/a/g;s/dog/cat/g" data

上述命令等价于:

sed -e "s/an/a/g" -e "s/dog/cat/g" data
显示被匹配的变量

&可以表示被匹配的变量,即若被匹配的变量为"abc",则&代表abc。

#功能为在每个an外加[]
sed -e "s/an/[&]/g" data

圆括号匹配

被圆括号括起来的匹配可以当做变量使用,注意圆括号匹配时括号需要""转义。变量按顺序使用\1,\2指代。

sed "s/this \(.*\) an \(.*\)/\1:\2/" data

结果:

is:dog an
is:cant
is:money
is:fish

sed命令

data内容:

this is a dog a
this is a cat
this is a money
this is a fish

N命令

N命令的作用是把下一行的命令纳入当做缓冲区。也就是缓冲区包括两行.

#只匹配缓冲区的第一个this
sed "N;s/this/that/" data

执行命令结果为:

that is a dog a
this is a cat
that is a money
this is a fish
sed "N;s/\n/,/" data

执行命令结果为:

this is a dog a,this is a cat
this is a money,this is a fish

a命令和i命令

  1. i命令的作用是在指定行前面插入一行,行号写在i前面,中间空格可有可无;如果不写行号默认在所有行的前面插入
#在第一行前面插入 this is my test i
sed "1i this is my test i" data
  1. a命令的作用是在指定行后追加内容,行号写在a前面,若不写表示所有行后。也可用$代表最后一行,不过一定要有空格.
#在第一行后插入 this is my test a
sed "1a this is my test a" data
  1. 可以使用匹配来添加
#若匹配到cat,则在当前行后追加一行 this is test match a
sed "/cat/a this is test match a" data

c命令

c命令是替换匹配的行

#替换第二行
sed "2 c this is test c" data

结果:

this is a dog a
this is test c
this is a money
this is a fish
#用匹配替换
sed "/fish/c this is the test c" data

结果:

this is a dog a
this is a cat
this is a money
this is the test c

d命令

d命令删除指定的行,可指定范围

#删除第2到3行
sed "2,3 d" data

结果:

this is a dog a
this is a fish
#删除找到cat指定的行
sed "/cat/d" data

结果:

this is a dog a
this is a money
this is a fish

#删除第二行到结尾
sed "2,$ d" data

结果:

this is a dog a

p命令

p命令的作用是打印匹配到的行.注意打印的时候使用-n参数。sed默认输出处理后的文本,使用-n参数阻止默认输出。

#打印匹配到cat的行
sed -n "/cat/p" data
#打印符合从一个模式当另一个模式的行
sed -n "/dog/,/money/p" data

结果:

this is a dog a
this is a cat
this is a money
#打印从第一行到匹配到的哪一行
sed -n "1,/cat/p" data

结果:

this is a dog a
this is a cat

=命令

=参数用于打印匹配到的行号

#打印含有cat的行号
sed -n "/cat/=" data

综合运用

将下列中所有的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
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100

shell命令如下:

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/"

结果如下:

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值