怎么学会SED


怎么学会SED,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下文中用到的测试文件可以在 https://github.com/mylxsw/sed-demo找到。概述SED的英文全称是 Stream EDitor,它是一个简单而强大的文本解析转换工具,在1973-1974年期间由贝尔实验室的Lee E. McMahon开发,今天,它已经运行在所有的主流操作系统上了。McMahon创建了一个通用的行编辑器,最终变成为了SED。SED的很多语法和特性都借鉴了ed编辑器。设计之初,它就已经支持正则表达式,SED可以从文件中接受类似于管道的输入,也可以接受来自标准输入流的输入。SED由自由软件基金组织(FSF)开发和维护并且随着GNU/Linux进行分发,因此,通常它也称作 GNU SED。对于新手来说,SED的语法看起来可能有些神秘,但是,一旦掌握了它的语法,你就可以只用几行代码去解决非常复杂的任务,这就是SED的魅力所在。SED的典型用途SED的用途非常广泛,例如:文本替换选择性的输出文本文件从文本文件的某处开始编辑无交互式的对文本文件进行编辑等工作流在本章中,我们将会探索SED是如何工作的,要想成为一个SED专家,你需要知道它的内部实现。SED遵循简单的工作流:读取,执行和显示,下图描述了该工作流:读取: SED从输入流(文件,管道或者标准输入)中读取一行并且存储到它叫做 模式空间(pattern buffer) 的内部缓冲区执行: 默认情况下,所有的SED命令都在模式空间中顺序的执行,除非指定了行的地址,否则SED命令将会在所有的行上依次执行显示: 发送修改后的内容到输出流。在发送数据之后,模式空间将会被清空。在文件所有的内容都被处理完成之前,上述过程将会重复执行需要注意的几点模式空间 (pattern buffer) 是一块活跃的缓冲区,在sed编辑器执行命令时它会保存待检查的文本默认情况下,所有的SED命令都是在模式空间中执行,因此输入文件并不会发生改变还有另外一个缓冲区叫做 保持空间 (hold buffer),在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。在每一个循环结束的时候,SED将会移除模式空间中的内容,但是该缓冲区中的内容在所有的循环过程中是持久存储的。SED命令无法直接在该缓冲区中执行,因此SED允许数据在 保持空间 和 模式空间之间切换初始情况下,保持空间 和 模式空间 这两个缓冲区都是空的如果没有提供输入文件的话,SED将会从标准输入接收请求如果没有提供地址范围的话,默认情况下SED将会对所有的行进行操作示例让我们创建一个名为 quote.txt 的文本文件,文件内容为著名作家Paulo Coelho的一段名言为了理解SED的工作流,我们首先使用SED显示出quote.txt文件的内容,该示例与cat命令类似在上面的例子中,quote.txt是输入的文件名称,两个单引号是要执行的SED命令。首先,SED将会读取quote.txt文件中的一行内容存储到它的模式空间中,然后会在该缓冲区中执行SED命令。在这里,没有提供SED命令,因此对该缓冲区没有要执行的操作,***它会删除模式空间中的内容并且打印该内容到标准输出,很简单的过程,对吧?在下面的例子中,SED会从标准输入流接受输入当上述命令被执行的时候,将会产生下列结果在这里,***行内容是通过键盘输入的内容,第二行是SED输出的内容。从SED会话中退出,使用组合键ctrl-D (^D)基础语法本章中将会介绍SED中的基本命令和它的命令行使用方法。SED可以用下列两种方式调用:***种方式在命令行中使用单引号指定要执行的命令,第二种方式则指定了包含SED命令的脚本文件。当然,这两种方法也可以同时使用,SED提供了很多参数用于控制这种行为。让我们看看如何指定多个SED命令。SED提供了delete命令用于删除某些行,这里让我们删除***行,第二行和第五行:首先,使用cat命令显示文件内容现在,使用SED移除指定的行,为了删除三行,我们使用-e选项指定三个独立的命令我们还可以将多个SED命令写在一个文本文件中,然后将该文件作为SED命令的参数,SED可以对模式空间中的内容执行文件中的每一个命令,下面的例子描述了SED的第二种用法首先,创建一个包含SED命令的文本文件,为了便于理解,我们使用与之前相同的SED命令接下来构造一个SED命令去执行该操作标准选项SED支持下列标准选项:-n 默认情况下,模式空间中的内容在处理完成后将会打印到标准输出,该选项用于阻止该行为-e 指定要执行的命令,使用该参数,我们可以指定多个命令,让我们打印每一行两次:。Paulo Coelho, The Alchemist。Paulo Coelho, The Alchemist-f 指定包含要执行的命令的脚本文件。Paulo Coelho, The AlchemistGNU选项这些选项是GNU规范定义的,可能对于某些版本的SED并不支持。-n, –quiet, –slient:与标准的-n选项相同-e script,–expression=script:与标准的-e选项相同-f script-file, –file=script-file:与标准的-f选项相同–follow-symlinks:如果提供该选项的话,在编辑的文件是符号链接时,SED将会跟随链接-i[SUFFIX],–in-place[=SUFFIX]:该选项用于对当前文件进行编辑,如果提供了SUFFIX的话,将会备份原始文件,否则将会覆盖原始文件-l N, –line-lenght=N:该选项用于设置行的长度为N个字符–posix:该选项禁用所有的GNU扩展-r,–regexp-extended:该选项将启用扩展的正则表达式-u, –unbuffered:指定该选项的时候,SED将会从输入文件中加载最少的数据,并且更加频繁的刷出到输出缓冲区。在编辑tail -f命令的输出,你不希望等待输出的时候该选项是非常有用的。-z,–null-data:默认情况下,SED对每一行使用换行符分割,如果提供了该选项的话,它将使用NULL字符分割行循环与其它编程语言类似,SED提供了用于控制执行流的循环和分支语句。SED中的循环有点类似于goto语句,SED可以根据标签(label)跳转到某一行继续执行,在SED中,我们可以定义如下的标签:在上面的示例中,我们创建了四个标签。要跳转到指定的标签,使用 b 命令后面跟着标签名,如果忽略标签名的话,SED将会跳转到SED文件的结尾。b标签用于无条件的跳转到指定的label。为了更好地理解SED中的循环和分支,让我们创建一个名为books2.txt的文本文件,其中包含一些图书的标题和作者信息,下面的示例中会合并图书的标题和作者,使用逗号分隔。之后搜索所有匹配“Paulo”的行,如果匹配的话就在这一行的开头添加-,否则跳转到Print标签,打印出该行内容。乍看来上述的代码非常神秘,让我们逐步拆解一下***行是h;n;H;x这几个命令,记得上面我们提到的 保持空间 吗?***个h是指将当前模式空间中的内容覆盖到 保持空间中,n用于提前读取下一行,并且覆盖当前模式空间中的这一行,H将当前模式空间中的内容追加到 保持空间 中,***的x用于交换模式空间和保持空间中的内容。因此这里就是指每次读取两行放到模式空间中交给下面的命令进行处理接下来是 s/n/, / 用于将上面的两行内容中的换行符替换为逗号第三个命令在不匹配的时候跳转到Print标签,否则继续执行第四个命令:Print仅仅是一个标签名,而p则是print命令为了提高可读性,每一个命令都占了一行,当然,你也可以把所有命令放在一行关于h,H,x命令参考官方手册 sed, a stream editor 3.6 Less Frequently-Used Commands节分支使用 t 命令创建分支。只有当前置条件成功的时候,t 命令才会跳转到该标签。t命令只有在前一个替换(s)命令执行成功的时候才会执行。让我们看一些前面章节中的例子,与之前不同的是,这次我们将打印四个连字符”-“,而之前是一个。在上面的例子中,前面两行与上一节中讲的作用一致,第三行定义了一个Loop标签,接下来匹配存在“Paulo”的行,如果存在则在最前面添加一个-,接下来是我们这里的重点:/—-/!t Loop这一行首先检查上面添加-之后是否满足四个-,如果不满足则跳转到Loop继续执行第三行,这样不停的追加-,***如果改行满足前面有四个-才继续往下执行。为了提高可读性,我们将每一个SED命令独立一行,我们也可以在同一行中使用:模式空间和保持空间模式空间对任何文件的来说,最基本的操作就是输出它的内容,为了实现该目的,在SED中可以使用print命令打印出模式空间中的内容。首先创建一个包含行号,书名,作者和页码数的文件,在本文中我们将会使用该文件,你也可以创建任何其它的文件,但是这里我们就创建一个包含以下内容的文件执行p命令你可能会疑惑,为什么每一行被显示了两次?你还记得SED的工作流吗?默认情况下,SED将会输出模式空间中的内容,另外,我们的命令中包含了输出命令p,因此每一行被打印两次。但是不要担心,SED提供了-n参数用于禁止自动输出模式空间的每一行的行为行寻址默认情况下,在SED中使用的命令会作用于文本数据的所有行。如果只想将命令作用于特定的行或者某些行,则需要使用 行寻址 功能。在SED中包含两种形式的行寻址:以数字形式表示的行区间以文本模式来过滤行两种形式都使用相同的语法格式数字方式的行寻址在下面的示例中SED只会对第3行进行操作当然,我们还可以让SED输出某些行。在SED中使用逗号,分隔输出行号的范围,例如下面的代码会输出出2-5行的内容特殊字符 $ 代表了文件的***一行,输出文件的***一行也可以使用 $ 指定输出的地址范围,下列命令输出第三行到***一行SED还提供了另外两种操作符用于指定地址范围,***个是加号(+)操作符,它可以与逗号(,)操作符一起使用,例如 M, +n 将会打印出从第M行开始的下n行。下面的示例将会输出第二行开始的下面四行我们还可以使用波浪线操作符(~)指定地址范围,它使用M~N的形式,它告诉SED应该处理M行开始的每N行。例如,50~5匹配行号50,55,60,65等,让我们只输出文件中的奇数行下面的代码则是只输出文件中的偶数行注意,如果使用的是Mac系统自带的sed命令,可能不支持~和+操作符。可以使用brew install gnu-sed –with-default-names重新安装GNU-SED。使用文本模式过滤器SED编辑器允许指定文本模式来过滤出命令要作用的行。格式如下:必须用正斜线将要指定的pattern封起来。sed编辑器会将该命令作用到包含指定文本模式的行上。下面的示例中,将会输出所有作者为Paulo Coelho的书籍。模式开发云主机域名匹配也可以与数字形式的寻址同时使用,在下面的示例会从***次匹配到Alchemist开始输出,直到第5行为止。使用逗号(,)操作符指定匹配多个匹配的模式。下列的示例将会输出Two和Pilgrimage之间的所有行在使用文本模式过滤器的时候,与数字方式的行寻址类似,可以使用加号操作符 +,它会输出从当前匹配位置开始的某几行,下面的示例会从***次Two出现的位置开始输出接下来的4行保持空间在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。有5条命令可用来操作保持空间关于保持空间这里就不在举例了,前面再循环部分讲解下面这个命令的时候我们已经对它的使用做了说明。基本命令本章将会讲解一些常用的SED命令,主要包括DELETE,WRITE,APPEND,CHANGE,INSERT,TRANSLATE,QUIT,READ,EXECUTE等命令。删除命令 d删除命令格式如下address1和address2是开始和截止地址,它们可以是行号或者字符串匹配模式,这两种地址都是可选的。由命令的名称可以知道,delete 命令是用来执行删除操作的,并且因为SED是基于行的编辑器,因此我们说该命令是用来删除行的。注意的是,该命令只会移除模式空间中的行,这样该行就不会被发送到输出流,但原始内容不会改变。为什么没有输出任何内容?默认情况下,SED将会对每一行执行删除操作,这就是该命令为什么没有在标准输出中输出任何内容的原因。下列命令只移除第四行SED也接受使用逗号(,)分隔的地址范围。我们可以构造地址范围去移除N1到N2行,例如,下列命令将删除2-4行SED的地址范围并不仅仅限于数字,我们也可以指定模式匹配作为地址,下面的示例会移除所有作者为Paulo Coelho的书籍我移除所有以Storm和Fellowship开头的行文件写入命令 wSED

相关推荐: 如何手动静态的设置IP地址

TP-LINK路由器为例子:一般默认的默认的路由器的网关的IP地址,也称为web管理IP地址,LAN网段IP地址,默认一般是192.168.1.1但是由于光猫的IP地址(外网的IP地址),也是192.168.1.1,所以一般往往会产生冲突,要么是修改LAN网络…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 04/11 17:03
Next 04/11 17:03