Linux中sed如何处理文本
副标题[/!--empirenews.page--]
sed处理文本的方法 sed在处理文本时,会先读取第一个输入行,将编辑命令应用于输入行,然后读取下一个输入行,并应用编辑命令。sed总是处理最新版本的行,因此sed中有多个编辑命令时,编辑命令的顺序对结果会有影响,下一个编辑命令会发生了变化的行而不是原始行,如示例: [root@fanyue sed]# cat test This is a pig. This is a cow. [root@fanyue sed]# sed 's/pig/cow/; s/cow/horse/' test This is a horse. This is a horse. 可以看到sed中第二个编辑命令处理的行是被第一个命令处理之后的内容。 模式空间 sed维护一种模式空间,即一个工作区或者临时缓冲区,当使用编辑命令时将在模式空间中存储单个输入行。一次一行的设计的有点是在读取非常庞大的文件时不会出现内存溢出或缓慢的问题。 初始时,模式空间包含有单个输入行的备份。然后按照命令顺序对模式空间的中的行进行处理。当应用了所有的指令后,当前行被输出,下一行被读入模式空间。然后脚本中的指令再次按顺序应用于新的行。即sed的处理步骤为: 生成输入行的备份到模式空间中 修改模式空间的中的备份 将修改后的备份输出到标准输出 回到上面的示例,如果我想将pig改为cow, cow改为horse改如何处理? [root@fanyue sed]# sed 's/cow/horse/; s/pig/cow/' test 1 This is a cow. 2 This is a horse. 将命令的顺序反转即可! sed还维护了一个称为保持空间(hold space)的另一个临时缓冲区,保持空间可以将模式空间的内容复制到保持空间并在以后检索它们。 sed的寻址 默认情况下,sed将命令用于每一个行。sed命令可以指定0个,1个或2个地址。每个地址都是一个描述模式、行号或者行寻址符号的正则表达式。 如果没有指定地址,那么命令将应用于每一行。 如果只有一个地址,那么命令应用于与这个地址匹配的任意行。 如果指定了由逗号分隔的两个地址,那么命令将应用于匹配第一个地址的第一行和它后面的行,直到匹配第二个地址的行(包括此行)。 如果地址后面跟有感叹号(!),那么命令就应该用于不匹配该地址的所有行。 例如,d命令代表删除匹配的行,一个d命令会删除所有的行,不会有任何输出,如: [root@fanyue sed]# cat test 1 This is a pig. 2 This is a cow. 3 This is a dog. 4 And this is a monkey!!! [root@fanyue sed]# sed 'd' test (编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |