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

# 本人微信: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 是一种在线编辑器,它一次处理一 ...
随机推荐
- 事件总线 EventBus
661. .net中事件模型很优雅的实现了观察者模式,同时被大量的使用在各种框架中. [2016-04-30 10:52:42]662. Prism框架中实现了一个典型的EventAggregator ...
- 约束路由 用正则表达式约束路由 Constraining a Route Using a Regular Expression 精通ASP-NET-MVC-5-弗瑞曼
- Java多态之Father f=new Son();
成员变量静态方法看左边,非静态方法编译看左边,运行看右边. 左边Father f其实是定义了一个Father类的对象,而右边new Son()可以只理解为是一个重写了Father类方法的对象. 因此, ...
- sqli_labs学习笔记(一)Less-1~Less-20
开门见山 Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入) · 方法一:手工UNION联合查询注入 输入单引号, ...
- c/python 的区别
c python ...
- laravel 队列服务使用总结
laravel 队列服务使用总结 使用步骤 配置队列驱动 //env文件,有的版本是QUEUE_DRIVER QUEUE_CONNECTION=database 迁移队列需要的数据表,在数据库中生成j ...
- mysql--->profile使用
Mysql分析-profile详解 简介 Profiling是从 mysql5.0.3版本以后才开放的. 启动profile之后,所有查询包括错误的语句都会记录在内. 此工具可用来查询SQL执行状态, ...
- Shell常用语句及结构
条件判断语句之if if 语句通过关系运算符判断表达式的真假来决定执行哪个分支:shell有三种if语句样式,如下: 语句1 if [ expression ] then Statement(s) t ...
- Java 分布式框架面试题合集
Java 分布式框架面试题合集 1.什么是 ZooKeeper? 答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案.设计目的是将那些复杂且容易出错的分布 ...
- Mysql百万数据量级数据快速导入Redis
前言 随着系统的运行,数据量变得越来越大,单纯的将数据存储在mysql中,已然不能满足查询要求了,此时我们引入Redis作为查询的缓存层,将业务中的热数据保存到Redis,扩展传统关系型数据库的服务能 ...