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#偶数行