sed
一、sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
二、sed命令格式
sed [options] 'command' file
sed [选项] ‘条件’ 文件路径
三、sed的增删改查
环境
cat >> test.txt <<EOF 01 oldboy CEO 02 Alex CEO02 03 oldgirl CEO small wife EOF
sed的选项
a 在当前行下面插入文本。
i 在当前行上面插入文本。
c 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
r file 从file中读行。
! 取反
= 打印当前行号码。
查:
查看单行
[root@timo ~]# sed -n '1p' test.txt
01 oldboy CEO
查看多行
[root@timo ~]# sed -n '1,2p' test.txt
01 oldboy CEO
02 Alex CEO02
查询连续的内容(查询内容包括oldboy 以及 oldfirl 中间的所有内容 连续的)
[root@timo ~]# sed -n '/oldboy/,/oldgirl/p' test.txt
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
查询不连续的内容
[root@timo ~]# sed -n '/oldboy/p;/oldgirl/p' test.txt
01 oldboy CEO
03 oldgirl CEO small wife
查看以03开头的
[root@timo ~]# sed -n '/^03/p' test.txt
03 oldgirl CEO small wife
查看以O结尾的
[root@timo ~]# sed -n '/O$/p' test.txt
01 oldboy CEO
正则查询(-r 支持拓展正则)
[root@timo ~]# sed -rn '/[d]/p' test.txt
01 oldboy CEO
03 oldgirl CEO small wife
增:
在第二行下插入
[root@timo ~]# sed '2a 022 wsir DSB' test.txt
01 oldboy CEO
02 Alex CEO02
022 wsir DSB
03 oldgirl CEO small wife
在第二行上插入
[root@timo ~]# sed '2i 022 wsir DSB' test.txt
01 oldboy CEO
022 wsir DSB
02 Alex CEO02
03 oldgirl CEO small wife
在最后一行插入
[root@timo ~]# sed '$a 022 wsir DSB' test.txt
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
022 wsir DSB
在多行下插入
[root@timo ~]# sed '1,3a **********' test.txt
01 oldboy CEO
**********
02 Alex CEO02
**********
03 oldgirl CEO small wife
**********
删:
删除单行
[root@timo ~]# sed '1d' test.txt
02 Alex CEO02
03 oldgirl CEO small wife
删除多行
[root@timo ~]# sed '1,2d' test.txt
03 oldgirl CEO small wife
根据内容删除
[root@timo ~]# sed '/Alex/d' test.txt
01 oldboy CEO
03 oldgirl CEO small wife
[root@timo ~]# sed '/old/d' test.txt
02 Alex CEO02
根据多个内容进行删除
sed -i '1i 00 wsir XXX' test.txt
增加一条记录 -i 进行保存
[root@timo ~]# sed -r '/Alex|wsir/d' test.txt
01 oldboy CEO
03 oldgirl CEO small wife
取反!
添加空行 用\表示空行
[root@timo ~]# sed -i '1a \' test.txt
查询不是空行的内容
[root@timo ~]# sed -n '/^$/!p' test.txt
00 wsir XXX
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
对比 查询空行(=表示查询内容所在行号)
[root@timo ~]# sed -n '/^$/=' test.txt
2
[root@timo ~]# sed -n '/^$/p' test.txt
工作中经常用到删除空行
[root@timo ~]# sed '/^$/d' test.txt
00 wsir XXX
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
改:
对一个字段进行替换 sed 's#原数据#替换数据#g' file
[root@timo ~]# sed 's#Alex#xxx#' test.txt
00 wsir XXX
01 oldboy CEO
02 xxx CEO02
03 oldgirl CEO small wife
对一行进行替换
[root@timo ~]# sed -e '1c xxxx' test.txt
xxxx
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
正则匹配替换
[root@timo ~]# sed -r 's#([0-9]{2})#xxx#' test.txt
xxx wsir XXX
xxx oldboy CEO
xxx Alex CEO02
xxx oldgirl CEO small wife
注意事项:
工作中-i进行更改时可与.aki同时使用避免误操作导致无法复原
[root@timo ~]# sed -i.bak '1a ******' test.txt
[root@timo ~]# ls
test.txt
test.txt.bak
[root@timo ~]# cat test.txt
00 wsir XXX
******
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
[root@timo ~]# cat test.txt.bak
00 wsir XXX
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
[root@timo ~]#
-i与-n不能同时使用 使用会造成文件内容只剩下你修改的那一行
测试时-in无问题正常 -ni时 效果如下,为避免损失请勿同时使用
[root@timo ~]# cat test.txt
01 oldboy CEO
02 Alex CEO02
03 oldgirl CEO small wife
[root@timo ~]# sed -ni 's#Alex#XXX#' test.txt
[root@timo ~]# cat test.txt
[root@timo ~]#
[root@timo ~]#