本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/32

记录下sed编译器的常见使用方法。

sed编辑器基于输入到命令行的或者是存储在文本文件中的命令来处理数据流中的数据。每次从输入中读取一行,用编辑器命令匹配数据,修改数据,输出到STDOUT。在流编辑器将所有命令与一行数据匹配之后,它会读取下一行数据并重复此过程。

替换

s/pattern/replacement/flags

关于flags:

  • 数字:新文本替换第几处模式的地方。
  • g:新文本会替换所有已有文本出现的地方。
  • p:原来行的内容打印出来。
  • w file:替换的结果写到文件中。

其中:-n和p一起使用,只会输出被substitute命令修改过的行

$ echo -e "This is test test\nThis is no" | sed -n 's/test/no/p'
This is no test

使用地址

默认,sed使用的命令会作用于所有行,使用行寻址使命令作用于特定的行。

两种方式:

  • 行的数字范围
  • 文本模式过滤出某行
[address]command

或者

address {
command1
command2
command3
}
数字方式
$ echo -e "one 1\ntwo 1\nthree 1" | sed "2,$ s/1/2/"
one 1
two 2
three 2

\(代表到最后一行,\)和s之间有空格。

文本模式
/pattern/command

pattern可以为正则表达式。

 $ echo -e "one 123\ntwo 456\nthree 789" | sed "/one/s/123/number/"
one number
two 456
three 789
组合命令
 $ echo -e "one 123\ntwo 456\nthree 789" | sed "2{
s/two/hehe/
s/456/444/
}"
one 123
hehe 444
three 789

或者:

$ echo -e "one 123\ntwo 456\nthree 789" | sed "2{s/two/hehe/;s/456/444/}"
one 123
hehe 444
three 789

删除行

上面的两种方法均适用。

 $ echo -e "one\ntwo\nthree\nfour" | sed "/two/d"
one
three
four

使用两个文本模式删除某个范围内的行

 $ echo -e "one\ntwo\nthree\nfour" | sed "/one/,/three/d"
four

插入和附加文本

  • 命令i在指定行之前插入
  • 命令a在指定行之后插入
sed '[address]command\
new line'
 $ echo -e "one\ntwo\nthree\nfour" | sed "$ a\five"
one
two
three
four
five

修改行

 $ echo -e "one\ntwo\nthree\nfour" | sed "3c\change"
one
two
change
four

使用区间:

$ echo -e "one\ntwo\nthree\nfour" | sed "1,2c\change"
change
three
four

sed会用这一行文本替换这两行,而不是逐一修改。

转换命令

转换命令是唯一可以处理单个字符的sed编辑器命令。

[address]y/inchars/outchars

将inchars和outchars进行一对一映射,如果长度不同,会产生一条错误消息。

转换命令是全局命令,会自动替换文本行中找到的指定字符的所有实例。

 $ echo -e "1\n2\n3\n4" | sed "y/123/789/"
7
8
9
4

回顾打印

  • p命令用来打印文本行
  • =命令用来打印行号
  • l命令用来列出行
打印行
 $ echo -e "one\ntwo\nthree\nfour" | sed -n '3{
p
s/three/substitude/p
}'
three
substitude

同时显示原来的和新的行文本。

打印行号
 $ echo -e "one\ntwo\nthree\nfour" | sed -n '3{
=
p
}'
3
three
列出行

l允许打印数据流中的文本和不可打印的ASCI字符。任何不可打印的字符都用他们的八进制前加一个反斜线或者标准C命名法。

 $ echo -e "one\ntwo\nthree\nfour" | sed -n 'l'
one$
two$
three$
four$

sed和文件一起工作

向文件写入
[address]w filename
 $ echo -e "one\ntwo\nthree\nfour" | sed "1,2w data"
one
two
three
four
$ cat data
one
two
从文件读取数据
[address]r filename

不能对读取命令使用地址区间,而只能使用单独一个行号或者文本模式地址,sed会将文件中的文本插入到地址之后。

$ cat data
one
two
$ echo -e "one\ntwo\nthree\nfour" | sed "3r data"
one
two
three
one
two
four

可以和删除命令一起使用来用另一个文件的数据替换文件中的占位文本。

$ cat data
Would the following people:
LIST
please report to the office
$ sed '/LIST/{
r list
d
}' data
Would the following people:
Zhangyachen
please report to the office

保持空间

模式空间是一块活动缓冲区,在sed编译器执行命令时它会保存sed编译器要检验的文本。

sed编辑器还利用了另一块缓冲区域,称作保持空间。你可以在处理模式空间中其他行是用保持空间来临时保存一些行。

命令 描述
h 将模式空间复制到保持空间
H 将模式空间附加到保持空间
g 将保持空间复制到模式空间
G 将保持空间附加到模式空间
x 交换两个空间的内容

next命令

单行next命令

小写的n命令会告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的最开始再执行一遍。

删除第一行之后的空白。

$ cat data
one two three
$ sed '/one/{
> n
> d
> }' data
one
two three
合并文本行

多行版本的next命令N会将下一文本加到已在模式空间中的文本上。将两个文本行合并到同一模式空间,文本行仍然用换行符分隔,但是sed编辑器现在会将两行文本当做一行来处理。

待续。。。

sed使用范例的更多相关文章

  1. awk sed 命令

    awk awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以 空格或TAB 为默认分隔符 将每行 ...

  2. Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)

    Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编   ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...

  3. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  4. awk sed 总结

    Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 #  awk [options ] ‘scripts’ file1 file2 .... # ...

  5. [转]sed命令详解

    转载:http://blog.chinaunix.net/u/22677/showart_1076318.html   1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...

  6. sed详细分析

    [一.简单描述] sed命令类似命令行的文本编辑器,以行为单位(见注1).除非带命令i(in-place)否则源文件内容并不会被更新.   [二.使用] [2.1.使用方式] 存在两种使用方式: 1. ...

  7. shell脚本基础——常用的sed命令举例

    一般在实际使用编辑器的过程中 , 常需要执行替换文件中的字符串.移动.删除.与搜寻数据行等等动作.当然 , 一般交互式编辑器(如 vi.emacs)都能做得到上述功能 , 但文件一旦有大量上述编辑需求 ...

  8. 文本替换sed+字段处理cut,join+awk重新编排字段

    [1]sed工具(Stream Editor)--流编辑器 sed 本身也是一个管线(管道)命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代.删除.新增.截取特 ...

  9. sed 详解

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

随机推荐

  1. jquery.uploadify+spring mvc实现上传图片

    一.前端页面 1.下载jquery.uploadify 去uploadify官网(http://www.uploadify.com/download/)下载压缩包,解压后放在如下路径: 2.html结 ...

  2. ubuntu下mysql提示Changed limits: max_open_files:1024解决办法

    在配置我的md5解密网站cmd5.la的时候,mysql5.7出现了max_open_files: 1024, max_connections: 214,warning: Changed limits ...

  3. Java开发步骤

    3.编辑Java源程序 使用纯文本编辑器,比如记事本notpad.exe:EditPlus.UltraEdit等专业的纯文本编辑器. Word不是纯文本编辑器. 需求:写一个Java程序,在控制台打印 ...

  4. Windows下根据端口号查找进程并关闭

    经常用到,但是总记不住命令,备忘一下…… netstat -aon|findstr "8080"  找到进程号 tasklist|findstr "7200"  ...

  5. PHP面向对象之const常量修饰符

    在PHP中定义常量是通过define()函数来完成的,但在类中定义常量不能使用define(),而需要使用const修饰符.类中的常量使用const定义后,其访问方式和静态成员类似,都是通过类名或在成 ...

  6. ES6模块化

    关于ES6模块化 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ruby 的require ...

  7. 如何编写一个稳定的网络程序(TCP)

    本节我们看一下怎样才能编写一个基于TCP稳定的客户端或者服务器程序,主要以试验抓包的方式观察数据包的变化,对网络中出现的多种情况进行分析,分析网络程序中常用的技术及它们出现的原因,在之后的编程中能早一 ...

  8. js内置构造函数属性修改问题

    在学习js原型时遇到一个问题,Array,Object等内置构造函数部分属性无法修改,我猜测可能是因为浏览器实现的原因造成的. 1.修改name属性无效. <script type=" ...

  9. Linux Rsync备份服务介绍及部署守护进程模式

    rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...

  10. linux系统编程:进程间通信-fifo

    进程间通信-fifo 进程间通信的还有一种方式是fifo. fifo是还有一种管道:有名管道.从名字能够看出.它也是队列. 使用fifo通信前,得先创建fifo $ mkfifo myfifo 随后仅 ...