世界上最好的Sed教程
这是一份世界上最好的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教程的更多相关文章
- Nivo Slider - 世界上最棒的 jQuery 图片轮播插件
		Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ... 
- 用Visual Studio Code Debug世界上最好的语言
		前言 这阵子因缘巧合接手了一个辣鸡项目,是用世界上最好的拍黄片写的,项目基本是另一个小伙伴在撸码,我就兼职打杂和发布做点运维的工作. 然后昨天项目上了测试版之后,一用起来Error满天飞了.让小伙伴查 ... 
- 用Visual Studio Code Debug世界上最好的语言(Mac篇)
		用Visual Studio Code Debug世界上最好的语言(Mac篇) 首先,你要有台Macbook Pro,接着才继续看这个教程. PS:Windows用户看这里用Visual Studio ... 
- 【转载】可能是世界上最牛逼的网站统计程序——Matomo
		大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ... 
- 干货!上古神器 sed 教程详解,小白也能看的懂
		目录: 介绍工作原理正则表达式基本语法数字定址和正则定址基本子命令实战练习 介绍 熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep.awk.sed,我们今天要聊的主角就 ... 
- 史上最详细git教程
		题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ... 
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
		为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ... 
- 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...
		世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西. 
- hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)
		小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)T ... 
随机推荐
- php .htaccess 伪静态
			# #以下是网站伪静态正则 # RewriteEngine On RewriteRule ^index.html$ index.php RewriteRule ^about.html$ about.p ... 
- 单源最短路——Dijkstara算法
			算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 1.将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q 2.设置 ... 
- pssh批量管理
			因为公司金融项目正式上线,有等保的要求,所有的线上服务器对操作过历史命令都要记录下来,需要修改一部分的配制文件.总共有300多台Linux服务器,总不能一台一台去改吧.首先想到是ansble,salt ... 
- Mysql 书写语句时避免出现关键字导致报错   关键字大全
			ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE C ... 
- Eclipse新建Java工程出现红色感叹号怎么解决?
			安装了新版本的JDK之后,在Eclipse中新建Java工程出现红色感叹号怎么解决? 其实只要在Eclipse中重新设置一下JDK路径就行了 路径:右键Java工程>>Build Path ... 
- 使用查询分析器和SQLCMD分别登录远程的SQL2005的1434端口
			SQLCMD是操作SQLSERVER的一个命令行工具, 而查询分析器是它的图形工具 查询分析器(SQL2005下叫managerment studio),连接远程的SQLSERVER2005, ... 
- Docker Kubernetes  hostPort 代理转发
			Docker Kubernetes hostPort 代理转发 hostPort: 1. 类似docker -p 映射宿主级端口到容器. 2. 容器所在的主机暴露端口转发到指定容器中. 3. hos ... 
- Python制作AI贪吃蛇
			前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都 ... 
- 事件Event实现消费者模型
			import timeimport randomfrom multiprocessing import Process,Queue def consumer(q,name): while True: ... 
- 委托&&异步
			private void ShowMessage(string message) { this.BeginInvoke(new MethodInvoker(delegate { txtSysMessa ... 
