sed命令简介
sed处理时,有2个缓冲区:【pattern space】和【hold space】
sed执行过程:
先读入一行,去掉尾部换行符,存入【pattern space】,执行编辑命令。 处理完毕,除非加了-n参数,把现在的【pattern space】打印出来,在后边打印曾去掉的换行符。 把【pattern space】置空。 接着读下一行,处理下一行。
sed的默认输出:【pattern space】里的内容输出到标准输出。
常用选项:
【pattern space】里的内容不输出到标准输出:-n
默认只能执行一个脚本,执行多个脚本:-e script, --expression=script
可以有多个-e script
如果要执行的脚本特别多,可以指定一个脚本文件:-f /path/to/sed_scirpt
脚本文件里,每行一个编辑命令。
支持使用扩展的正则表达式,默认是基本正则表达式:-r
直接编辑原文件:-i
地址定界:
1,不给地址:对全文进行处理
2,单地址
- #:指定行
- /pattern/:被此模式所匹配到的每一行
3,地址范围
$:最后一行
#,#:起始和结束
#,+#:起始,和从起始加多少行
#,/pat1/:起始到,pat1匹配到的行
/pat1/,/pat2/:pat1匹配到的行,到pat2匹配到的行
4,步进:~
- 1~2:1,3,5,7,9.。。行(所有奇数行)
- 2~2:2,4,6,8,10.。。行(所有偶数行)
编辑命令:
如果有多个命令,则用分号分隔。
删掉【pattern space】里的内容:d
删除/etc/fstab的第一行到第五行。
# sed '1,5d' /etc/fstab
打印【pattern space】里的内容:p
乍一看是打印奇数行,但实际是把偶数行打印了出来,而且奇数行打印了2遍。
# sed '1~2p' /etc/fstab
使用-n禁止sed的默认行为后,就是打印奇数行了
# sed -n '1~2p' /etc/fstab
在行前插入:-i \text 支持使用\n实现多行插入
# sed '3a \new line\nother line' /etc/fstab #
# /etc/fstab
new line
other line
在UUID行前加一段注释:
# sed '/^UUID/i \#this is base for UUID' /etc/fstab
#this is base for UUID
UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0
在行后插入:-a \text 支持使用\n实现多行插入
# sed '3i \new line\nother line' /etc/fstab #
new line
other line
# /etc/fstab
替换行:-c \text 把匹配到的行,替换成text
把以UUID开头的行,整行替换成text。
# sed '/^UUID/c \#this is base for UUID' /etc/fstab
保存匹配到的行,到指定文件中:-w /path/to/save
把不以#号开头的行,保持到/tmp/fsnew
# sed -n '/^[^#]/w /tmp/fsnew' /etc/fstab
把指定文件中的内容插入到匹配行的后面:-r /path/to/insert
在/etc/fstab的第三行的后面,插入/tmp/tst的内容。
# cat /tmp/tst
aaa
bbb
[root@localhost ~]# sed '3r /tmp/tst' /etc/fstab #
# /etc/fstab
aaa
bbb
在匹配到的行的上一行,加上行号:=
在以UUID开头的行的上一行加上行号
# sed '/^UUID/=' /etc/fstab #
# /etc/fstab
# Created by anaconda on Fri Nov 29 16:44:28 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
10
UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0
匹配到的行不执行后面的命令;没匹配到的行执行后面的命令:!。注意:!处理命令之前。
删除不以#开头的行:
# sed '/^#/!d' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Nov 29 16:44:28 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
查找替换:s/要替换的/替换成的/替换标记。它的分隔符/可以自己指定,常用的有s@@@,s###
替换标记:
- 全局替换:g
- 将替换成功的结果保存到文件:w /path/to/save
- 显示替换成功的行:p
练习
1,删除test文件中所有以空白字符开头的行的行首的所有空白字符
# cat test
11
222
333
\+:匹配前面的次数为大于等于1
# sed 's@^[[:space:]]\+@@' test
11
222
333
# sed -n 's@^[[:space:]]\+@@p' test
11
333
2,删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面所有空白字符
# sed 's@^#[[:space:]]*@@' /etc/fstab
3,删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面所有空白字符,和删除所有以UUID开头的行
# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
4,输出一个绝对路径给sed命令,取出其目录部分,其行为类似dirname
message后面如果有/就匹配不成功了。
# echo "/var/log/messages" | sed 's@[^/]\+$@@'
/var/log/
message后面即使有/也能匹配:非/
[^/]:非/
\+:至少一个
/\?:/有0个或者1个
# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
/var/log/
message后面即使有/也能匹配
由于使用了-r(扩展正则表达式),+和?前面的\可以省略了。
# echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'
/var/log/
[root@localhost ~]#
高级编辑命令
- 把【pattern space】空间中的内容覆盖到【hold space】空间:h
- 把【pattern space】空间中的内容追加到【hold space】空间,然后删除【pattern space】空间中的内容:H
- 把【hold space】空间中的内容覆盖到【pattern space】空间:g
- 把【hold space】空间中的内容追加到【pattern space】空间,然后删除【hold space】空间中的内容:G
- 互换【hold space】【pattern space】里的内容:x
- 把匹配到的行的下一行放入【pattern space】,并把匹配到的行删除掉:n
- 把匹配到的行的下一行放入【pattern space】,不删除匹配到的行:N
- 删除【pattern space】空间中的行:d
- 删除多行模式下【pattern space】里的所有行。(比如用N了,【pattern space】里就有多行):D
1,显示偶数行:
执行过程:先把第一行读入到了【pattern space】,后面的命令的n。n的意思是读下一行,并删除当前【pattern space】里的内容后,再把下一行的内容放入【pattern space】;接下来的命令是p,p就是把当前【pattern space】里的内容输出到标准输出,所有第二行就打印到了标准输出了。然后读第3行,后面的命令是n,就再读一行,以此类推。
# sed -n 'n;p' /etc/fstab
2,倒置文本:
参看:https://blog.csdn.net/itsenlin/article/details/21129405
执行过程:先把第一行读入到了【pattern space】,发现第一行的命令是1!G,所以不做处理;接着是h,则把【pattern space】的内容,覆盖到【hold space】;接着是命令$!d,因为不是最后一行,所以执行d命令,删除【pattern space】里的内容。
读第二行到【pattern space】,发现命令是1!G,由于不是第1行了,所以执行G命令,把hold space】的内容追加到了【pattern space】,这时【pattern space】里放的是第二行和第一行的内容,而且第二行在第一行的前面。接着是$!d,由于不是最后一行,所以执行d命令,删除【pattern space】里的内容。
# cat test
11
222
333
最后一行,没有执行d,而且【pattern space】里的内容,而且没有使用-n,所以就把倒叙打印到标准输出了。
# sed '1!G;h;$!d' ./test
333
222
11
也可以用下面的命令,实现倒置。
由于没有使用d命令,所以【pattern space】里一直有内容,所以就必须用-n,最后一次用p命令把【pattern space】里的内容输出到标准输出。
# sed -n '1!G;h;$p' test
3,取出最后一行:
# sed '$!d' /etc/fstab
4,取出最后二行:
# sed '$!N;$!D' test
5,删除原有的所有空白行,而后为所有的非空白行添加一个空白行
# cat test
11
空行
空行
222
空行
空行
333
444
555
666
# sed '/^$/d;G' test
11
空行
222
空行
333
空行
444
空行
555
空行
666
空行
6,显示奇数行
# sed 'n;d' /etc/fstab
7,在每一行后面添加一个空白行
# sed 'G' /etc/fstab
8,练习H和g的用法:
# cat t2
one
two
three
# sed 'H;g' t2
一个空行
one
一个空行
one
two
一个空行
one
two
three
图解:H是往hold space里追加,hold space里,其实是有一个换行的。所以第一次把one加到hold space后,one的前一行就是空行。
# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854
sed命令简介的更多相关文章
- sed 命令简介
sed 默认把文件内容全部显示出来(擅长取行 替换) 参数如下: - n 取消默认输出 一般与P一起使用 查看内容‘10,20p’ 显示10-20 行的内容 - i 修改文件内容 - i.bak ...
- shell基础 -- grep、sed、awk命令简介
在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...
- 文本处理三剑客之sed命令
第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...
- linux sed命令详解
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- [转]sed命令详解
转载:http://blog.chinaunix.net/u/22677/showart_1076318.html 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...
- Linux的sed命令
一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces.sed -i 's/12 ...
- linux sed命令
一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces. sed -i 's/1 ...
- Linux之Sed命令详解(总结一些实用例子)
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- linux sed命令参数及用法详解
linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...
随机推荐
- 生成链接中的全限定URL(Generating Fully Qualified URLs in Links) | 在视图中生成输出URL | 高级路由特性
结果:<a class="myCSSClass"href="https://myserver.mydomain.com/Home/Index/MyId#myFrag ...
- 建立MVC的依赖项注入 Setting up MVC Dependency Injection 精通ASP-NET-MVC-5-弗瑞曼
The result of the three steps I showed you in the previous section is that the knowledge about the i ...
- 浅谈JS异步(asychrouous)
一.概念 (1)asychronous 异步 是JS这种单线程语言解决多任务的一种方法,将耗时的任务(io)设定为异步工作,先交给浏览器负责相关功能的线程来实现耗时的部分工作,按顺序放入任务队列中,等 ...
- Guava中强大的排序器Ordering使用
一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...
- 虚拟机ubuntu系统怎么添加 VMware tools
首先弹出光盘 然后安装 点击安装VMware tools 然后进入光盘 打开VMware tools 文件夹 将解压文件拉到桌面上 打开桌面上的文件夹 不选中文件 然后键入下面的内容 输入密码 输入y ...
- QIIME2使用方法
激活qiime2的执行环境:source activate qiime2-2019.4如何查看conda已有的环境:conda info -e 以下分析流程参考:https://docs.qiime2 ...
- Java基础知识之设计模式--单例模式
Java设计模式--单例模式 声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网 什么是设计模式(Design Pattern)? 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设 ...
- 二、Django学习之增删改查
增加数据 第一种方式 def index(request): #创建记录方式1 #实例化要添加的记录(对象) student_obj = models.Student( name='dazhuang' ...
- SSH(二)
SSH框架整合的系统架构,Action.Service.Dao.SessionFactory.DataSource都可以作为Spring的Bean组件管理 使用HibernateDaoSupport基 ...
- FFMPEG学习----分离视音频里的PCM数据
/** * 参考于:http://blog.csdn.net/leixiaohua1020/article/details/46890259 */ #include <stdio.h> # ...