sed
sed
Sed表示流编辑器(Stream Editor)的缩写.
出处:https://www.runoob.com/linux/linux-comm-sed.html
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
实例
在test2文件的第四行后添加一行,并将结果输出到标准输出:
# cat test2 total 16 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log # sed -e 4a\newline test2 total 16 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log newline -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log
以行为单位的新增/删除
将test 的内容列出并且列印行号,同时,请将第 2~3 行删除:
# nl test2 | sed -e '2,3d' 1 total 16 4 -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log 5 -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log
在第二行后(亦即是加在第三行)加上『testadd word』字样
# nl test2 | sed -e '2a testadd word' 1 total 16 2 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log testadd word 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log 4 -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log 5 -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log #
以行为单位的替换与显示
将第4行到最后一行的内容替换成 【substitute】
# nl test2 | sed -e '4,$c substitute' 1 total 16 2 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log substitute
仅列出文件内的第 5-7 行
# nl test2 | sed -n '2,4p' 2 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log 4 -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log
数据的搜寻并显示
搜索 test有error关键字的行
# nl test2 | sed -n '/error/p' 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log 5 -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log
数据的搜寻并删除
删除test有error关键字的行,其他行输出
# nl test2 | sed '/error/d' 1 total 16 2 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log 4 -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log
数据的搜寻并执行命令
搜索test2,找到error对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把log替换为LOG,再输出这行:最后的q是退出。
# nl test2 | sed -n '/error/{s/log/LOG/;p;q}' 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_LOG
数据的搜寻并替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代
# sed 's/access/*****/g' test2 total 16 -rw-r--r-- 1 root root 1991 Oct 23 11:03 *****_log -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_*****_log -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log
直接修改文件内容
sed 的 -i 选项可以直接修改文件内容
# sed -i 's/access/*****/g' test2 # cat test2 total 16 -rw-r--r-- 1 root root 1991 Oct 23 11:03 *****_log -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_*****_log -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log