sed简介

sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk.

sed又称行编辑器,每次读取并处理一行文本.

工作原理

1.sed命令开始执行后

2.先从文本中读取第一行,放在模式空间 (pattern space)中

3.判断这行文本是否符合指定模式,符合则进行编辑,然后把结果输出到标准输出.

4.不符合的话默认也会输出到标准输出.除非特别指定不输出不符合的结果行.

5.继续读取下一行,以此类推.

  • sed默认会对文件的每一行做处理.
  • 可以指定sed仅处理匹配到的行
  • 默认不对原文件进行编辑,只输出处理结果
  • 在sed的高级用法中会用到sed的另一个空间:保持空间(hold space).
  • 模式空间读进来的数据可以放进保持空间等待后续操作,两个空间的数据可以自由移动,互相覆盖或追加.

sed原理简图

命令格式

sed [option]... 'script' inputfile..

script:

sed处理文本所应用的脚本,如地址定界,编辑操作

sed的选项(options)

-n:不自动输出模式空间的内容到屏幕

-e script, --expression=script:实现多点编辑,

如:

 # sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r , --regexp-extended: 支持使用扩展正则表达式

-i[SUFFIX], --in-place[=SUFFIX]:对原文件进行编辑

-i.bak: 编辑原文件前会先创建一个 原文件名+.bak后缀的备份

地址定界:

(1) 不给地址:对全文进行处理

(2) 单地址:

#: 指定的行

/pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围

#,#:从第#行开始到第#行结束

#,+#:从第#行开始,加#行

#,/pat1/:从第#行开始,到第一次被模式匹配的行结束

/pat1/,/pat2/:从被模式1匹配到的第一行开始,到被模式2匹配到的第一行结束;

$:最后一行

(4)步进:~

1~2:表示从1开始,步进2行,如3,5,7行即所有奇数行

2~2:表示所有偶数行

示例:

文件text内容如下:

$ cat text
1a
2b
3c
4d
5e
6f
7g
8h
9i $ sed -n '2p' /etc/issue #显示第二行
2b $ sed -n '/e$/p' text #显示e结尾的行
5e $ sed -n '4,8p' text #显示第4到第8行
4d
5e
6f
7g
8h $ sed -n '4,+3p' text #显示第4行以及后面的3行
4d
5e
6f
7g $ sed -n '/c$/,/^7/p' text #显示c结尾的行开始到7开头的行中的所有行
3c
4d
5e
6f
7g $ sed -n '5,/^7/p' text #显示第五行开始到7开头的行中的所有行
5e
6f
7g $ sed -n '2~3p' text #从第2行开始,每隔3行显示一行
2b
5e
8h $ sed -n '1~2p' text #显示奇数行
1a
3c
5e
7g
9i

常用一般编辑命令

d: 删除模式空间匹配的行,并立即进入下一轮循环

p:打印当前模式空间内容,追加到默认输出之后

a [\]text:在指定行后面追加文本,支持使用\n实现多行追加

i [\]text:在行前面插入文本

c [\]text:把匹配到的行替换为单行或多行文本

w /path/somefile: 保存模式匹配的行至指定文件

r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后

=: 为模式空间中的行打印行号

!:模式空间中匹配行取反处理

示例:

	$ cat /etc/passwd -n | sed '2,51d' #删除2-51行
1 root:x:0:0:root:/root:/bin/bash
52 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
53 named:x:25:25:Named:/var/named:/sbin/nologin $ sed '2~2d' text #删除偶数行,显示奇数行
1a
3c
5e
7g
9i $ df | sed -n '/^\/dev\/sd/p' #过滤出dev/sd开头的行
/dev/sda2 52403200 3932216 48470984 8% /
/dev/sda5 20961280 142872 20818408 1% /app
/dev/sda1 1038336 161556 876780 16% /boot $ sed '2,4a\ = = =' text #在2-4行后面分别追加自定义字符,斜线\表示之后出现的所有字符都算内容.
1a
2b
= = =
3c
= = =
4d
= = =
5e
6f
7g
8h
9i $ sed '4i\ = = =' text #在第4行上方加入字符
1a
2b
3c
= = =
4d
5e
6f
7g
8h
9i $ sed '/^6/c\6666' text #把第6行替换为6666
1a
2b
3c
4d
5e
6666
7g
8h
9i $ sed -n '/^alias/w /app/alias.txt' ~/.bashrc #把.bashrc文件中的alias开头的行保存到/app/alias.txt中
$ cat alias.txt
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' $ sed '/^alias/r /etc/centos-release' ~/.bashrc #把/etc/centos-release中的内容插入到.bashrc中被模式匹配到的行之后
# .bashrc # User specific aliases and functions alias rm='rm -i'
CentOS Linux release 7.4.1708 (Core)
alias cp='cp -i'
CentOS Linux release 7.4.1708 (Core)
alias mv='mv -i'
CentOS Linux release 7.4.1708 (Core) # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi $ sed '/^alias/=' ~/.bashrc #在匹配到的行只上添加行号
# .bashrc # User specific aliases and functions 5
alias rm='rm -i'
6
alias cp='cp -i'
7
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi $ sed -n '/^alias/!p' ~/.bashrc #显示没有被匹配到的行(结果取反)
# .bashrc # User specific aliases and functions # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi $ sed -n '/e$/!p' text #显示除了e结尾的行的所有行
1a
2b
3c
4d
6f
7g
8h
9i

查找替换:

s///,支持使用其它分隔符,如 s@@@,s### ,s___

替换标记:

g: 行内全局替换

p: 显示替换成功的行

w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

示例:

	$ sed -rn 's@^[0-9]+@@p' text  #删除所有数字开头行的数字
a
b
c
d
e
f
g
h
i $ sed 's@.*@#&@' text #给text文件中每一行前面加#号
#1a
#2b
#3c
#4d
#5e
#6f
#7g
#8h
#9i # 删除文件中以#号开头后跟一个空白字符的行的开头的#和空白字符
$ cat text2
this is 1
# this is 2
#this is 3
# this is 4
this is 5 $ sed 's@^#[[:space:]]@@' text2
this is 1
this is 2
#this is 3
this is 4
this is 5 # 给text2文件中不以#开头的行的行首加#号
$ cat text2
this is 1
# this is 2
#this is 3
# this is 4
this is 5 $ sed 's@^[^#].*@#&@' text2
#this is 1
# this is 2
#this is 3
# this is 4
#this is 5 $ echo /app/testdir/rootdir/motd/ | sed -r 's@(^/.*/)(.+)/?@\1@' #取目录名
/app/testdir/rootdir/
$ echo /app/testdir/rootdir/motd/ | sed -r 's@(^/.*/)(.+)/?@\2@' #取基名
motd/ $ ifconfig ens33| sed -rn 's@.*inet (.*) netmask.*@\1@p' # 取出 ifconfig ens33命令中的ipv4地址
192.168.5.137

文本处理三剑客之 Sed ——一般编辑命令的更多相关文章

  1. 文本处理三剑客之 Sed ——高级编辑命令

    本篇介绍sed的高级编辑命令 高级编辑命令 P:打印模式空间开端至\n内容,并追加到默认输出之前 n: 读取匹配到的行的下一行覆盖至模式空间 N:读取匹配到的行的下一行追加至模式空间 h: 把模式空间 ...

  2. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  3. 文本处理三剑客之sed

    sed 1.简介 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(patternspace),接着用sed命令处理缓冲区中的内 ...

  4. 文本处理三剑客之 sed详解

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  5. 文本处理三剑客之 sed

    sed:文本流编辑器 主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行 sed [选项] [sed内置命令字符] [输入文件] Options: -n:取消默认的sed输出,常与sed内置命 ...

  6. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  7. sed 流编辑命令

    1.命令功能 sed非交互式的流编辑器,sed不会修改源文件内容,除非重定向来保存输出结果:默认情况下所有的输出行都将被打印到屏幕上. 2.语法格式 sed  [option]  {script-on ...

  8. 4.shell编程-文本处理三剑客之sed

    4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...

  9. Linux 文本三剑客之 sed

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

随机推荐

  1. Yii “CDbConnection failed to open the DB connection: could not find driver"解决办法

    前言:用Yii框架做项目时,有时会遇到“CDbConnection failed to open the DB connection: could not find driver”这个问题,这个问题通 ...

  2. React.js 小书 Lesson20 - 更新阶段的组件生命周期

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson20 转载请注明出处,保留原文链接和作者信息. 从之前的章节我们了解到,组件的挂载指的是将组件 ...

  3. 常用Oracle的SQL语句20181206更新

    --clob转字符串:dbms_lob.substr() --锁表:select object_name,machine,s.sid,s.serial# from v$locked_object l, ...

  4. QSS为Qt程序添加不一样的样式

    添加 QSS 样式文件 在 Qt 项目中新建一个或使用已有的 Qt Resource File,在资源文件下面新建一个普通文件,命名为 Light.qss: 为 Light.qss 添加如下内容: 这 ...

  5. 从零实现一个简易的jQuery框架之二—核心思路详解

    如何读源码 jQuery整体框架甚是复杂,也不易读懂.但是若想要在前端的路上走得更远.更好,研究分析前端的框架无疑是进阶路上必经之路.但是庞大的源码往往让我们不知道从何处开始下手.在很长的时间里我也被 ...

  6. 架构实战项目心得(八):dubbo知识的整理

    1 Dubbo启动时检查.集群容错.负载均衡.线程模型的设置以及选项:    启动时检查:(1)Dubbo默认会在启动的时候检查依赖的服务是否可用,不可用时会抛出异常.阻止Spring初始化完成.以便 ...

  7. golang学习之select用法

    早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...

  8. nodejs操作excel并配合edatagrid使用

    nodejs读取文件夹下子文件(夹)名称: /** * 查询tmp文件夹下子文件夹名称 */ router.post("/tmpList", function (req, res) ...

  9. 如何使用 MySQL EntityFramework 组件处理 MYSQL PaaS DB

    MySQL Database on Azure 是 Azure 平台上推出的 MySQL 云数据库服务,通过全面兼容 MySQL 协议,为用户提供了一个全托管的性能稳定.可快速部署.高可用.高安全性的 ...

  10. 生成自签名证书-开启https

    1.生成CA证书 # 生成 CA 私钥 openssl genrsa -out ca.key 2048 # X.509 Certificate Signing Request (CSR) Manage ...