这是一份世界上最好的sed教程,sed是unix系统下流编辑里的超人。最初我写这份说明是为了我的

第二本电子书,然而随后我决定把这份说明变成一本免费电子书预览的同时再次做为文章发布到这里。

Sed说明

掌握sed可以简化为理解和操作sed的四种空间,这四种空间分别为:

  • 输入流
  • 模式空间
  • 保持空间
  • 输出流

可以这样去想像空间这个词,sed读入输入流和产生输入流,在内部它有模式空间和保持空间。sed从输入流读入数据直到它读到换行字符(\n),然后它把当前读到的数据(不包含新行字符)放入模式空间。大部分的sed命令在模式空间操作读入的数据。保持空间的存在是为了方便操作,可以把它想像成一个你可以在模式空间和保持空间之间复制和交换数据的临时缓冲。当sed执行完所有的命令后,它输出模式空间的内容并在结尾加上一个换行符(\n).

可以使用-n选项去修改sed的行为。当使用-n选项的时候,sed不输出模式空间,你必须使用p或P命令明确指定打印。

让我们通过一些实例来理解这四种空间和sed。这些仅仅是一些描述sed看起来像什么 和它是什么的例子。

以下可能是最简单的sed程序

sed ‘s/foo/bar/’

这个程序在每一行上将文本foo替换为文本bar。它的工作方式是这样的,考虑你有一个包含这些行的文件:

abc
foo
123-foo-456

sed打开这个文件作为输入流,并开始读入这个文件。当它读abc的时候发现一个新行字符(\n), 它就把abc放入模式空间并应用s/foo/bar命令,因为在模式空间的文本字符是“abc”,没有文本字符“foo”,sed不对模式空间做任何操作。 此刻,sed已经执行完了所有的命令(此例中仅仅只有一个命令),当所有的命令执行完的默认动作是打印模式空间和新行字符(\n),所以第一行的输出是“abc\n”

现在sed读第二行到模式空间,执行s/foo/bar. 这将会用foo替代bar,模式空间里就只包含“bar”, 到达命令的结尾,然后sed打印模式空间的内容,跟着是新行字符(\n). 第二行输出为“bar\n”

现在读入第三行的内容,模式空间的内容为“123-foo-456”, 因为文本“123-foo-456里含 有foo”,命令“s/foo/bar执行成功,模式空间里的内容就变为“123-bar-456”,到达命令的结尾,然后sed打印模式空间的内容。输出为“123-bar-456\n”

此刻文件所有的行已经读入处理然后sed退出。示例脚本的输出为

abc
bar
123-bar-456

因为不需要临时存储这个例子里没有用到保持缓冲空间

在看有临时存储的例子之前,让我们来看一看三个命令行开关:-n,-e和-i。首先是-n

如果对sed指明-n选项,如下:

[kennminn@bogon Script]$ sed -n 's/foo/bar/' t1.txt

然后当执行完脚本时sed将不会打印模式空间的内容。所以如果你对上面的示例文件执行这个程序,将不会有输出。你必须使用sed的p命令强制打印空间的内容。

[kennminn@bogon Script]$ sed -n 's/foo/bar/;p' t1.txt
abc
bar
123-bar-456

你可以看到,sed命令以分号(;)分隔。你也可以使用-e选项来分隔命令:


[kennminn@bogon Script]$ sed -n -e 's/foo/bar/' -e 'p' t1.txt
abc
bar
123-bar-456

它和你使用分号(;)分隔是一样的效果,接下来,让我们看一看-i这个命令行选项。这个命令强制sed原位置修改目标文件。意味着它会读取这个文件内容,执行sed命令,然后把新的内容放回到文件。

这里有一个例子,考虑你有一个文件叫做“users”,它里面有以下内容

pkrumins:hacker
esr:guru
rms:geek

你希望将整个文件中的“:”以“;”替换。你可以这样简单的处理:

[kennminn@bogon Script]$ sed -i 's/:/;/' users.txt
pkrumings;hacker
esr;guru
rms;geek

它将静静的在文件中所有行上执行‘s/

世界上最好的Sed教程的更多相关文章

  1. Nivo Slider - 世界上最棒的 jQuery 图片轮播插件

    Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...

  2. 用Visual Studio Code Debug世界上最好的语言

    前言 这阵子因缘巧合接手了一个辣鸡项目,是用世界上最好的拍黄片写的,项目基本是另一个小伙伴在撸码,我就兼职打杂和发布做点运维的工作. 然后昨天项目上了测试版之后,一用起来Error满天飞了.让小伙伴查 ...

  3. 用Visual Studio Code Debug世界上最好的语言(Mac篇)

    用Visual Studio Code Debug世界上最好的语言(Mac篇) 首先,你要有台Macbook Pro,接着才继续看这个教程. PS:Windows用户看这里用Visual Studio ...

  4. 【转载】可能是世界上最牛逼的网站统计程序——Matomo

    大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...

  5. 干货!上古神器 sed 教程详解,小白也能看的懂

    目录: 介绍工作原理正则表达式基本语法数字定址和正则定址基本子命令实战练习 介绍 熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep.awk.sed,我们今天要聊的主角就 ...

  6. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  7. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  8. 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...

    世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.

  9. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

随机推荐

  1. linux iptables详解(转)

    概述 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成 ...

  2. poj3155 最大密度子图

    求最大密度子图 记得在最后一次寻找的时候记得将进入的边放大那么一点点,这样有利于当每条边都满流的情况下会选择点 #include <iostream> #include <algor ...

  3. 使用axios优雅的发起网络请求

    原文链接:https://www.jianshu.com/p/73585303fdc0 公司项目使用了vue作为技术栈,便理所应当地使用了官方推荐的axios进行网络请求,这里记录下axios的封装方 ...

  4. vue用mand-mobile ui做交易所移动版实战示例

    vue用mand-mobile ui做交易所移动版实战示例 先展示几个界面: 目录结构: main.js // The Vue build version to load with the `impo ...

  5. dotnet Core 异步任务

    使用线程池中线程的任务启动方式 线程池提供了一个后台线程的池,独自管理线程,按需增加或减少线程池中的线程数.线程池中的线程用于执行一些动作后仍然返回线程池中. using System; using ...

  6. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  7. Python Mysql 交互

    Mysql 安装Python模块   Linux: yum install MySQL-python Windos: http://files.cnblogs.com/files/wupeiqi/py ...

  8. Python爬虫(三)——开封市58同城出租房决策树构建

    决策树框架: # coding=utf-8 import matplotlib.pyplot as plt decisionNode = dict(boxstyle=') leafNode = dic ...

  9. 剑指offer(5)用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目分析 栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不 ...

  10. react的dva框架初试

    使用背景:迫不得已!!(自己入职是以vue技术入职的,说是马上vue项目就来了,让我负责这个项目的前端.但是入职后就让我下了现在这个项目看下,然后就顺理成章的帮忙进行开发了,其实自己一直想要做reac ...