Linux sed 命令
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
- -e<script>或--expression=<script> 允许对输入数据应用多条 sed 命令编辑
- -f<script文件>或--file=<script文件>从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -r在 sed 中支持扩展正则表达式。
- -i: 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
注:a c i 插入多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。
对 sed 命令大家要注意,sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。
1.查看指定行
[root@iZ1la3d1xbmukrZ ~]# cat student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]# sed -n ‘2p‘ student.txt 1 Lm 82 95 86 87.66 [root@iZ1la3d1xbmukrZ ~]#
2.删除2-4行(对本身文件不修改)
[root@iZ1la3d1xbmukrZ ~]# sed ‘2,4d‘ student.txt ID Name PHP Linux MySQL Average [root@iZ1la3d1xbmukrZ ~]# cat student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]#
3.添加数据
[root@iZ1la3d1xbmukrZ ~]# sed 2a\hello student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 hello 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]# sed ‘2i hello \ > world‘ student.txt ID Name PHP Linux MySQL Average hello world 1 Lm 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66
4.替换数据
[root@iZ1la3d1xbmukrZ ~]# cat student.txt | sed ‘2c No such person\ No such person ‘ ID Name PHP Linux MySQL Average No such person No such person 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]#
5 字符串替换
“c”动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用“s”动作了。s 动作的格式是:
[root@localhost ~]# sed ‘s/旧字串/新字串/g’ 文件名
直接进行简单替换
[root@iZ1la3d1xbmukrZ ~]# sed ‘s/74/99/g‘ student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 2 Sc 99 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]#
正则进行替换
[root@iZ1la3d1xbmukrZ ~]# cat student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 2 Sc 74 96 87 85.66 3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]# sed ‘4s/^/#/g‘ student.txt ID Name PHP Linux MySQL Average 1 Lm 82 95 86 87.66 2 Sc 74 96 87 85.66 #3 Tg 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]#
执行多个替换
[root@iZ1la3d1xbmukrZ ~]# sed -e ‘s/Lm//g ; s/Tg//g‘ student.txt ID Name PHP Linux MySQL Average 1 82 95 86 87.66 2 Sc 74 96 87 85.66 3 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]# sed -e ‘s/Lm//g > s/Tg//g‘ student.txt ID Name PHP Linux MySQL Average 1 82 95 86 87.66 2 Sc 74 96 87 85.66 3 99 83 93 91.66 [root@iZ1la3d1xbmukrZ ~]#
“-e”选项可以同时执行多个 sed 动作,当然如果只是执行一个动作也可以使用“-e”选项,但是这时没有什么意义。还要注意,多个动作之间要用“;”号或回车分割。