sed

Posted zwj-linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
ewline 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

 

以上是关于sed的主要内容,如果未能解决你的问题,请参考以下文章

将 SED 命令转换为 linux 命令

sed命令取消注释代码行

Sed - 查找和替换 html 代码中的文本(从一种语言到另一种语言)

使用 sed 或 awk 预处理 C/C++ 代码时如何定位可靠的函数?

sed 删除

微信小程序代码片段