sed可以非交互式的修改文本,逐行操作
sed的命令格式:
前置命令 | sed 选项 '定位符+指令' 或者 sed 选项 '定位符指令' 文本文件
例如:
df -h | sed -n 'p'
#这就是把df -h的内容再输出一遍
sed 'p' 2.txt
指令:
一般指令:
删除整行d,修改字符s,查整行p,行后追加a,行前追加i,替换目标行c
特殊指令
'=' 显示文本中所有行的行号,例如:sed -n '=' 2.txt
'$=' 显示最后一行的行号,例如:sed -n '$=' 2.txt 这里的$代表最后一个,也可以与其他字符一起使用,代表最后匹配的字符
常用选项:
-n 屏蔽默认输出,这个是一定要加的
-r 支持扩展正则
-i 写入文件,不加这个选项就只是查看文本,可以不加i先测试
一般指令详解:所有的指令需要用''括起来
p
查行,并输出指定内容,通常与选项 -n 一起使用
例如:
sed -n 'p' 2.txt #指令p需要-n屏蔽默认输出,因为sed不管用了哪个指令,都会输出一遍默认输出,再有p的输出,就成了两次输出了
查并输出这个文本的第二行:
sed -n '2p' 2.txt #p前面加数字就是输出第几行
查并输出这个文本的1到3行:
sed -n '1,3p' 2.txt #用,表示连贯,输出两者都满足的行
查并输出这个文本第1行,然再额外看后面两行:
sed -n '1,+2p' 2.txt #想多看1行,就是+1p
查并输出这个文本第1行和第3行:
sed -n '1p;3p' 2.txt
查并输出这个文本第1行,然后再输出第 1+2行,1+2+2,1+2+2+2,1+2+2+2+2 ....直至文本结束,也就是1 3 5 7行
sed -n '1~2p' 2.txt
查找并输出最后一行
sed -n '$p' 2.txt
用正则匹配:
sed -n '/正则定位符/p' 文本文件
sed -n -r '/扩展正则定位符/' 文本文件
例如:
sed -n '/^root/p' 2.txt #找并输出root开头的行
sed -n '/haha/!p' 2.txt #显示不包含haha的行
sed -r -n '/[A-Z][a-z]{2}/'
d
删行,不能删单个字符,通常与选项 -i 一起使用(测试时可以先不加-i查看效果),通常不与选项 -n 一起使用,因为d不像p有输出功能
例如:
sed -i 'd' 2.txt #删文本的第一行,删第几行就是 几d
sed -i '2,5d' 2.txt #删2到5行
sed -i '1,+3d' 2.txt #删第1行,和紧接着后面的3行
sed -i '1p;3d' 2.txt #删第1行,和第3行
sed -i '1~3d' 2.txt #删第1行,1+2 1+2+2 1+2+2 ...直至文本结束
sed -i '$d' 2.txt #删最后一行
sed -i '/正则定位符/d' 2.txt
例如:sed '/[rot]/' 2.txt #删包含rot这3个字母中任意一个字母的行
sed -i -r '/扩展正则/d' 2.txt
s
改字符,通常与选项 -i 一起使用(测试时可以先不加-i查看效果),通常不与选项 -n 一起使用,因为d不像p有输出功能
例如:
cat /mnt/2.txt
old old old
old old old
old old old
sed -i 's/old/new/' 2.txt #换每行的第1个old,换成new
sed -i 's/old/new/2' 2.txt #看文本中哪行有两个'old',就改这行的第二个'old',如果有多行,则多行都改第2个
显示如下
old new old
old new old
old new old
sed -i '/^a/s/$/***/' 1.txt #先找到以a开头的行,别的命令都是在几行,所以s前没体现定位符,然后再进行替换操作,把末尾改成***,这是在末尾直接加,要想改末尾的最后一个字符就是.$
sed -i '2s/old/new/' 2.txt #换第2行的第1个old,第一行可以写1s
sed -i '2s/old/new/2' 2.txt #换第2行的第2个old
sed -i 's/old/new/g' 2.txt #换整个文本中所有old
sed -i '2s/old/new/g' 2.txt #换第2行的所有old
sed -i '2,3s/old/new/g' 2.txt #换第2行到第3行中的所有old
sed -i '4s/\^/\#/2' 3.txt #把第4行的特殊符号^换成特殊符号#
sed -i '2s/.//2;/.$//' 2.txt #把第2行的第2个字符替换为空(就是删除),再把每一行的最后一个字符替换为空
sed -i 's/[0-9]//g' 2.txt #把所有数字全删了
sed -i '3s/old/new/2;3s/old/new2/2' 2.txt
#换第3行第2个old,和第3个old
#为什么;后面这条指令最后还是2,因为你前面一个old改完了,对于sed来说这行的第三个old就变成第二个了,所以这么写
显示如下:
old old old
old old old
old new new2
sed 中的///这个隔离符可以换成 ! @ # $ % ^ & * ( ) 这些符合都可以做隔离符,比如我们要换一些特殊的字符串如/bin/bash 就可以换个隔离符,不用///,不然会报错
s还可以与 p 和 -n 一起使用,只显示替换成功的行:
sed -i -n '3s/old/new/2p' 2.txt
sed -i -r '1s/(oo){2}//' /etc/passwd #把第一行的第一组oo换成空
s的调换功能:
cat 1.txt
ah sdahpp ah
我要把第二组ah的 a 和 h 调换位置,变成 ha
sed -r -i '1s/(a)(h)/\2\1/2' 1.txt
将第一行的首字符和尾字符调换
sed -r -i '1s/^(.)(.*)(.)$/\3\2\1/' 1.txt
#因为这属于是匹配上一整行了,所以没必要再告诉sed替换第几个字符了
#不想要1了,不写就会删掉
给文档中所有的小写字母套上[]
sed -r -i '1s/([a-z])/[\1]/g' 1.txt
a
在指定行的下面,新起一行追加内容,想实际生效,需要与 -i 一起使用,定位目标行的方法参考p
sed 'a 888' 1.txt #在每一行下面新起一行追加内容
sed '/^a/a haha' 1.txt #先定位a开头的行,然后在这行下面新起一行,写haha
sed '1,3a 888' 1.txt #第1一直到第3行,这些行下面都追加
i
在指定行的上面,新起一行追加内容,定位目标行的方法参考p
c
替换行,定位目标行的方法参考p
sed '1c 888' 1.txt #把第一行替换成888
基于sed用法编写一个判断yum仓库是否可用的脚本:
#!/bin/bash
a='0'
b=$(yum repolist | sed -n '$p') #repolist在最后一行,让sed输出最后一行
c=$(echo ${b##* } | sed '1s/,//') #字符串处理,把b中的空格和空格以前内容全删了,只要数字和逗号,再交给sed把逗号删了,就剩数字了
if [[ $a == $c ]];then #俩[],假如参数c中有特殊符号,单括号就报错了,没有的话俩括号也没毛病,所以条件测试[[]]最稳
echo '你yum仓库坏了'
else
echo '你yum仓库没毛病'
fi