cat file | sed s/foo/bar/ > file不能在同一条管道操作中同时 读写 一个文件
只能先将输出写到临时文件中再用mv命令
正确为sed 's /foo/bar/g' file > 临时文件 && mv 临时文件 file
总结知识点:
#sed [选项] '条件指令' 文件
选项:
-n 屏蔽默认输出
-r 支持扩展正则
-i 修改源文件
----------------------p打印-----------------------------------
sed -n 输出你想输出的行
'/root/p' 打印包含root的行
‘/^bin/p’打印包含以bin开头的行
‘/bash$/p’打印包含bash结尾的行
sed -n '$=' a.txt打印文件行数
所有p 可以替换成d
sed -n 'n;p' a.txt 输出a.txt的偶数行 n 表示跳过当前行,读入下一行文本
sed -n 'p;n' a.txt 输出a.txt的奇数行 n 表示跳过当前行,读入下一行文本
sed -n '4,+10p' a.txt 打印4到后面的10行
sed -n '2,4p' a.txt 打印第1行 到 第4行
sed -n '2p;6p' a.txt 打印第1行 和 第6行
-----------------d删除-------------------------------------------------------------------------------------
sed '1d;6d' a.txt 删除第1行 和 第6行
sed '1,6d' a.txt 删除第1行 到 第6行
sed '/xml/d' a.txt 删除包含xml的行
sed '/xml/!d' 删除不包含xml的行
sed '/^$/d' 删除空行
sed '$d' 删除最后一行
sed '/^$/{n;/^$/d}' a.txt 删除多余的空行。多个空行只保留一个(结合了正则表达式enter,如果只有一个空行就跳过去)
----------------------------------------------------------------替换
sed 's/xml/XML/' 每行中的第一个xml替换为XML
sed 's/xml/XML/3' 每行中的第3个替换成XML
sed 's/xml//g' 将所有的xml删除,替换为空
sed 's#/das/czc/x#/111/222/333#' a.txt 将/das/czc/x 替换成/111/222/333(#号代替分割符/,也可以用其他符号代替/更加清晰的表达而已)
sed '4,7s/^/#/' a.txt 将第4到7行注释掉
sed 's/^#an/an/' 解除以#an开头的行注释
sed -r 's/^(.)(.*)(.)$/3\2\1/' 将文件中每行的第一个、倒数第1个字符互换『-r打扩展正则。/里面表示一个整体。后面数字反撇号。‘ ‘单引表s执行的项』
sed 's/[0-10000]//' 要加-r打开扩展正则 把数字0到10000删除
sed -r 's/^ 要加-r打开扩展正则( 空格键 )+//' 把文本中的行首空格删除,()里面要打空格
-----------------------------i前面写入 《a 后面追加》 c替换--------------------------------------------------------
sed ' 2i 故事' /nssswd.txt 将第二行前面写入故事
sed ' 2a 故事' 将第二行后面追加写入故事
sed '2c 故事会' 将第二行替换为故事会
sed -i '1c Server' 将主机名替换为Server -i 要打开
sed -i '$a 111111' ($表示最后一行,a表示一行后面追加)
目标后面替换
id=733.333.333 用sed把a.txt文件中id=后面的ip733.333.333替换成别的ip192.168.5.100
sed 's/\(id=\).*/\1192.168.4.100/g' a.txt 把id=后面的 任意字符任意个数 替换城 192.168.4.100,ip前面的数字1是必须要存在的
sed 's/\(id=\)[0-9].*/\1733.333.333/g' a.txt 这是正则方式,意思同上
sed '/^id/cid=111.111.111.111' a.txt 或者通过grep找到目标进行整行替换
文本块处理
i 前面加文本
sed '2iQQ:98989' a.txt 把第2行前面加一行QQ:98989
sed '2,5iQQ:98989' a.txt 把第2到第5行前面加一行QQ:98989
a 后面加文本
sed '2,5axxx' a.txt 把第2行到第5行后面加一行xxx
sed '2axxx' a.txt 把第2行后面加一行xxx
c替换(整行替换)
sed '/^d/cXXX' a.txt 把开头d的整行替换XXX
sed 's/^d/XXX/' a.txt 与s不同,用s的话是只把包含^d的替换成XXX
sed '2cyy' a.txt 相当于把第2行删掉换成yy 而已
多行需要处理时候用\n
sed '2cqq\nww\neeee' a.txt 把第2行后面换成qq,接着下面的行换成ww,eeee
或者用\强制换行
[root@web1 ~]# sed '2cqq\
> qqwweqeqe\
> aaaa\
> 443434' a.txt
/正则/
指令:
p 打印
d 删除
s 替换s/旧/新/g
a 追加
i 插入
c 替换行