正则表达式-sed-用法详解

前端之家收集整理的这篇文章主要介绍了正则表达式-sed-用法详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sed命令:

sed是一种流编辑器,它是文本处理中非常使用的工具,能够完美的配合正则表达式使用。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


sed语法格式:

sed [options] 'command' file

匹配字符集

^匹配行开始,如:/^sed/匹配所有以sed开头的行。
$匹配行结束,如:/sed$/匹配所有以sed结尾的行。
.匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
*匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^]匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<匹配单词的开始,如:/\匹配单词的结束,如/love
\>/匹配包含以love结尾的单词的行。
x\{m\}重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\}重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\}重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
sed命令常见用法

打印指定行

[root@test1~]#grep-n'.*'passwd|sed'10'p-n

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

#打印第10行

[root@test1~]#grep-n'.*'passwd|sed'1,3'p-n

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

#打印第1-3行

[root@test1~]#grep-n'.*'passwd|sed'22,$'p-n

sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

MysqL:x:500:500::/home/MysqL:/sbin/nologin

zabbix:x:501:501::/home/zabbix:/sbin/nologin

#打印第22行到最后

打印匹配字符的行

[root@test1~]#sed-n'/root/'ppasswd

[root@test1~]#sed-n'/r\(oo\)\+t/'ppasswd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@test1~]#sed-r-n'/r(oo)+t/'ppasswd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

#可以使用^$.*+?()等特殊符号正则表达式需要脱义或者使用-r参数

打印多个匹配字符的行 2中方法

[root@test1~]#grep-n'.*'passwd|sed-n-e'/root/'p-e'/MysqL/'p

1:root:x:0:0:root:/root:/bin/bas/MysqLh

1:root:x:0:0:root:/root:/bin/bas/MysqLh

11:operator:x:11:0:operator:/root:/sbin/nologin

22:MysqL:x:500:500::/home/MysqL:/sbin/nologin

#第一行同时匹配2个字符输出2次流式编辑器特点

[root@test1~]#grep-n'.*'passwd|sed-n'/root/p;/MysqL/p'

root:x:0:0:root:/root:/bin/bas/MysqLh

root:x:0:0:root:/root:/bin/bas/MysqLh

operator:x:11:0:operator:/root:/sbin/nologin

删除以数字开头的行

[root@test1~]#sed-r'/[^0-9]/'dpasswd

替换 sed的主要功能就是用来替换

[root@test1~]#sed'1,2s/ot/to/g'passwd
roto:x:0:0:roto:/roto:/bin/bas/MysqLh
bin:x:1:1:bin:/bin:/sbin/nologin
#其中s表示替换,g表示全局替换,否则只替换一次,/也可以为#、@等

删除第一行所有数字

[root@test1~]#grep'.*'passwd|sed'1,1s/[0-9]//g'
root:x:::root:/root:/bin/bas/MysqLh
bin:x:1:1:bin:/bin:/sbin/nologin

调换两个字符串位置

[root@test1~]#head-2passwd|sed-r's/([^:]+)(:.*:)([^:]+$)/\3\2\1/g'
/bin/bas/MysqLh:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin

直接修改文件内容

[root@test1 ~]# sed -i 's/ot/to/g' 1.txt

正则表达式\w\+匹配每一个单词,使用[&]替换它,&对应于之前所匹配到的单词:
[root@test1~]#echothisisatestline|sed's/\w\+/[&]/g'
[this][is][a][test][line]

文件读入:r命令

file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容显示在所有匹配行的下面:

sed'/test/rfile'filename

写入文件:w命令

在example中所有包含test的行都被写入file里:

sed-n'/test/wfile'example

追加(行下):a\命令

将thisisatestline追加到以test开头的行后面:
sed'/^test/a\thisisatestline'file在test.conf
文件第2行之后插入thisisatestline
sed-i'2a\thisisatestline'test.conf

下一个:n命令

如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续

sed'/test/{n;s/aa/bb/;}'file

变形:y命令

把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令

sed'1,10y/abcde/ABCDE/'file
sed'1,10s/[a-z]/\u&/g'file
sed'1,10s/[A-Z]/\l&/g'file

退出:q命令

打印完第10行后,退出

sedsed'10q'file

打印奇数行或偶数行

方法1: sed -n 'p;n' test.txt #奇数行

sed-n'n;p'test.txt#偶数行

方法2: sed -n '1~2p' test.txt #奇数行

sed-n'2~2p'test.txt#偶数行

猜你在找的正则表达式相关文章