了解sed的基础知识,然后下载我们的备忘单以快速轻松地参考Linux流编辑器。很少有Unix命令像sed、grep和awk一样出名,它们经常被组合在一起,可能是因为它们的名字古怪和强大的文本解析能力。它们在语法和逻辑上也有一些相似之处。虽然它们都可以用于文本解析,但是它们都有各自的特殊性。本文研究了sed命令,它是一个流编辑器。我以前写过关于sed及其远亲ed的文章。要熟悉sed,对ed有一点了解会有所帮助,因为它有助于您熟悉缓冲区的概念。本文假定您熟悉sed的基础知识,这意味着您至少运行过经典的s/foo/bar风格的查找和替换命令。下载我们的免费sed备忘单安装sed如果您使用的是Linux、BSD或macOS,则它们已经安装了GNU或BSD的sed。这些是原始sed命令的独特重新实现。虽然它们很相似,但还是有一些细微的差别。本文已经在Linux和NetBSD版本上进行了测试,因此您可以使用您在计算机上找到的任何sed,但是对于BSDsed,您必须使用短选项(例如-n而不是--quiet)。GNUsed通常被认为是功能最丰富的sed,因此无论您是否运行Linux,您都可能想尝试一下。如果您在Ports树中找不到GNUsed(在非Linux系统上通常称为gsed),您可以从GNU网站下载源代码。安装GNUsed的好处是您可以使用它的额外功能,但如果您需要可移植性,您也可以限制它以符合sed的POSIX规范。MacOS用户可以在MacPorts或Homebrew上找到GNUsed。在Windows上,您可以通过Chocolatey安装GNUsed。了解模式空间和保留空间sed一次只能处理一行。因为它没有视觉模式,所以创建了一个模式空间,它是一个内存空间,其中包含来自输??入流的当前行(删除了任何尾随换行符)。填充模式空间后,sed将执行您的指令。当命令完成执行时,sed将模式空间的内容打印到输出流,默认情况下这是标准输出,但可以将输出重定向到一个文件,甚至使用--in-重定向到同一个文件place=.bak选项。然后,循环再次从下一个输入行开始。为了在遍历文件时提供一点灵活性,sed还提供了保持空间(有时称为保持缓冲区),即sed内存中为临时数据存储保留的空间。您可以将保留空间视为剪贴板,事实上,这正是本文所演示的内容:如何使用sed进行复制/剪切和粘贴。首先,创建一个包含以下内容的示例文本文件:第一行第三行第二行将数据复制到保留空间要将内容放入sed的保留空间,请使用h或H命令。小写的h告诉sed覆盖保留空间中的当前内容,而大写的H告诉sed将数据附加到保留空间中已有的内容。单独使用,什么也看不到:$sed--quiet-e'/three/h'example.txt$--quiet(缩写为-n)选项会抑制所有输出,但sed可以满足我的搜索需要。在这种情况下,sed选择包含字符串3的任何行并将其复制到保留空间。我没有告诉sed打印任何东西,所以没有输出。从保留空间复制数据要了解保留空间,可以从保留空间复制内容,然后使用g命令将其放入模式空间,观察会发生什么:$sed-n-e'/three/h'-e'g;p'example.txtLinethreeLinethree第一个空行是因为当sed第一次将内容复制到模式空间时,保留空间是空的。接下来的两行包含第三行,因为这是第二行的保留空间。该命令使用两个独特的脚本(-e)纯粹是为了提高可读性和组织性。将步骤分成单独的脚本可能很有用,但从技术上讲,以下命令与一个脚本语句一样有效:$sed-n-e'/three/h;G;p'example.txtLinethreeLinethreeputsthedataAppendtopatternspaceG命令会将换行符和保持空间的内容添加到模式空间。$sed-n-e'/three/h'-e'G;p'example.txtLineoneThreeLinethreeLinetwoLinethree此输出的前两行包含模式空间(第一行)和空保持的内容空间。接下来的两行匹配搜索文本(三),因此它包含模式空间和保持空间。第三行的保持空间没有改变,所以在模式空间的末尾(第二行)是保持空间(仍然是第三行)。使用sed剪切和粘贴既然您知道如何将字符串从模式空间移动到保持空间并再次返回,您可以设计一个sed脚本来复制、删除和粘贴文档中的一行。比如把例子文件的第三行移到第三行,sed可以解决这个问题:$sed-n-e'/three/h'-e'/three/d'\-e'/two/G;p'example.txtLineoneLinetwoLine3第一个脚本找到包含字符串3的行并将其从模式空间复制到保留空间,替换保留空间中当前的任何内容。第二个脚本删除任何包含字符串3的行。这实现了与文字处理器或文本编辑器中的剪切动作等效的功能。最后一个脚本找到包含字符串二的行,将保持空间的内容附加到模式空间,然后打印模式空间。任务完成。使用sed编写脚本同样,使用单独的脚本语句纯粹是为了视觉和心理上的简单性。剪切和粘贴命令与脚本一样有效:$sed-n-e'/three/h;/三/d;/二/G;p'example.txtLineoneLinetwoLinethree甚至可以写成专门的脚本文件中:#!/usr/bin/sed-nf/three/h/three/d/two/gp运行脚本,添加到可执行权限,然后用示例文件试试:$chmod+xmyscript.sed$./myscript.sedexample.txtLineoneLinetwoLine3当然,你需要解析的文本越可预测,就越容易用sed解决问题。为sed操作(例如复制和粘贴)发明“配方”通常是不切实际的,因为触发操作的条件可能因文件而异。但是,您越熟练使用sed命令,就越容易根据需要解析的输入设计复杂的动作。重要的是识别不同的操作,知道sed何时移动到下一行,并预测模式和保留空间包含的内容。下载备忘单sed很复杂。虽然它只有十几个命令,但其灵活的语法和本机功能意味着它充满了无限的潜力。我过去常常参考一些简洁的单行代码来充分利用sed,但直到我开始发明(有时是重新发明)我自己的解决方案时,我才觉得自己真正在学习sed。如果您正在寻找有关命令提示符和语法的有用提示,请下载我们的sed备忘单并开始学习sed一劳永逸!
