sed

一、sed工作流程

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。

处理时,先把当前处理的行内容存储在临时缓冲区中,称为“模式空间”(pattern space),

之后再用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容打印到屏幕。

接着处理下一行,这样不断重复,直到文件末尾。


注意:

模式空间的内容和 AWK 中的 $0 是一样的,处理每行的时候,都会被重新赋值为当前行的内容

文件内容并没有改变,除非你使用重定向存储输出。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


二、命令格式

处理单个文件的命令格式

sed    [options]  '[匹配模式]    sed 的内部命令'      file1

处理多个文件的命令格式

sed    [options]  '[匹配模式]    [sed 的内部命令]'      file1  file2

options 选项是可选的,没有也行

匹配模式 是可选的用于在文件中每一行进行匹配到模式,模式可以是正则,也可以是文件的行号

内部的命令也是可选的,但是两个单引号是必须的


注:

sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0只有当命令存在语法错误时,sed的退出状态才是非0


三、支持正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。

正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。


使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\{\}

使用扩展元字符集 ?, +, { }, |, ( )


使用扩展元字符的方式:

sed  -r

在实际使用的时候,都会加上 -r 参数,即使没有用的扩展正则也不会有任何影响。

四、sed的基本用法

打印

sed -rn  '/root/p'   file   显示root的行 ^ 匹配root 开头 ^root

p 是 sed 的内部命令,是 打印(输出) 的作用

-n 屏蔽默认输出使用

搜索替换--重点,实际应用多

替换文本中的字符串:

sed 's/book/books/' file

后缀 /g 标记会替换每一行中的所有匹配:

sed 's/book/books/g' file

当需要从第N处匹配开始替换时,可以使用 /ng

echo sksksksksksk | sed 's/sk/SK/2g'

skSKSKSKSKSK

i  是同时忽略大小写

sed  -r  's/root/shark/gi '  test

找到含有 test 的进行删除

sed  -r  ' s/^test/ d ' test


注意:

当在模式匹配中使用其他界定符号时,需要对其进行转义。

其他界定符用在 s 搜索替换时不必转义。

例如:

sed  -r  's#root#test#'  test

sed  -r  's%root%test%'    test

sed  -r  's|root|test|'    test


五、sed扩展

全部删除

sed  -r  'd '  test

第 3 行删除

sed  -r  '3  d '  test

第 1 行到第 3 行删除

sed  -r  '1,3  d '  test

从含有 root 字符串的行开始匹配,一直删除到 第 5 行

sed  -r  '/root/,5  d'  test

从含有 halt 的行开始删除,并删除此行之后的 2 行,就是总共删除 3 行

sed  -r  '/halt/,+2  d'  test

! 取反,含有 root 的行不删除,其他都删除

sed  -r  '/root/  !d'  test

使用行号除以 2 ,余数是 1 的行删除(每次处理的行号是被除数,第二个数是除数,第一数是 余数)

sed  -r  '1~2  d'  test

sed -n '1~2 p' test    #奇数行

sed -n '2~2 p' test    #偶数行

六、sed命令

替换命令:s

替换文本中的字符串:

sed 's/root/test/g'  test

sed -rn 's/[0-9][0-9]/&.5/  p'  test    #&代表在查找串中匹配到的所有内容

//把所有查找到的两位数后面都加上 .5

sed -r 's/(test)qwer/\1技能/g'  test       #()括号分组,一个()就是一组\1,第二个就是\2

//把匹配到的所有test后面的qwer都换成“技能”

追加命令:a

sed -r '$ a 1.1.1.1 www.qianfeng.com' /etc/hosts    #在最后添加1.1.1.1 www.qianfeng.com

插入命令:i

sed -r '2i\111' /etc/hosts    #把111插入到第二行

修改命令:c

sed -r '2c\111' /etc/hosts    #把第二行命令修改为111

七、sed常见命令

删除开头的一个或者多个  空格或者 Tab 键

sed -ri '/^[ \t]*/d'  test

YUM 源修改

sudo sed -e s/^#baseurl/baseurl/g \

-e s/^mirrorlist/#mirrorlist/g  \

-i  /etc/yum.repos.d/CentOS-Base.repo

删除配置文件中//号的注释行

sed -ri '\Y^[ \t]*//Yd' file.conf

删除无内容空行

- 开头和结尾之间什么都没有的行

- 开头和结尾之间有多个空格的行

- 开头和结尾之间有多个  Tab 键的行

sed -ri '/^[ \t]*$/d' file.conf

删除注释行和空行

以下 3 中效果一样

sed -ri '/^[ \t]*#/d; /^[ \t]*$/d'  test

sed -ri '/^[ \t]*#|^[ \t]*$/d'  test

sed -ri '/^[ \t]*($|#)/d'  test

给文件行添加注释

sed -ri '1,5s/^/#/ '  test

sed -r '2,6s/(.*)/#\1/'  test

sed中使用外部变量

var=1

sed -r "3a$var1" /etc/hosts

sed -r '$a'"$var1" /etc/hosts

sed -r "\$a  $var1" /etc/hosts

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • sed ## 流编辑器 sed 一、sed工作流程 sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处...
    花泽菠菜xqc阅读 4,514评论 0 0
  • 行前或行后插入 sed 'p;s/^.*$/--------/' file awk '{print $0;prin...
    不排版阅读 3,613评论 0 0
  • 简介 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p...
    699b979fc4da阅读 4,700评论 0 1
  • 说明:本篇文章来自老男孩,这里只做备份记录 功能说明 Sed是Stream Editor(流编辑器)缩写,是操作、...
    think_lonely阅读 4,071评论 0 2
  • Sed工具工作原理及特性 1. sed是流编辑器,每一次读取一行到内存中,即称之为模式空间(pattern spa...
    魏镇坪阅读 13,757评论 0 12

友情链接更多精彩内容