Sed没有通常的文本框,而是根据用户命令直接写入文件。sed命令是为AT&T最初的Unix操作系统第7版创建的,从那时起可能每个Unix和Linux操作系统都包含它。sed应用程序是一个流编辑器,与文本编辑器不同,它不会打开用于加载文件数据进行处理的可视化缓冲区。相反,它根据在终端输入的命令或脚本中的一系列命令逐行操作文件。安装如果您使用的是Linux、BSD或macOS,则您已经安装了sed的GNU或BSD版本。这是原始sed命令的两个不同的重新实现,虽然它们相似,但也有一些细微差别。GNUsed通常被认为是功能最丰富的sed,并且在这些平台上广泛可用。如果您找不到GNUsed(在非Linux系统上通常称为gsed),您可以从GNU网站下载它的源代码。安装GNUsed的好处是您可以使用它的额外功能,但如果您需要可移植性,它也可以限制为仅符合sed的POSIX规范。在Windows上,您可以安装带有Chocolatey的GNUsed。Sed的工作原理sed应用程序一次处理一行。因为它没有视觉显示,所以它在内存中创建了一个模式空间:一个包含输入流的当前行的空间(删除了任何尾随的换行符)。一旦填充了模式空间,就会执行您对sed的指令。有时您的指令是有条件的,有时是无条件的,因此这些指令的结果取决于您如何使用sed。当命令结束时,sed会将模式空间的内容打印到输出流中。默认输出流是标准输出,但它可以重定向到一个文件,甚至可以使用--in-place=.bak选项重定向到同一个文件。然后从下一个输入行再次开始循环。sed命令的语法是:$sed--options[optionalSCRIPT][INPUTFILEorSTREAM]找到你想编辑的在可视化编辑器中,你通常不需要想太多,你可以找到你想要的要在文本文件中修改的内容。您的眼睛(或屏幕阅读器)扫描文本以寻找您想要更改的词或您想要插入或删除文本的位置,然后您就可以开始输入了。并且sed没有交互模式,因此您需要告诉它必须满足哪些条件才能运行特定命令。在这些示例中,假设名为example.txt的文件包含文本:helloworldThisislinethree。这是最后一行。指定行号的行号告诉sed只对文件中的那一行进行操作。例如,以下命令选择文件的第1行并打印它。因为sed的默认操作是在处理后向标准输出打印一行,所以这样做的效果是重复第一行:$sed'1p'example.txtthellohelloworld这是第三行。这里是最后一行。你也可以指定它一步一步的行号。例如1~2表示每两行选一行(“从第一行开始每两行选一行”)。指令1~3表示从第一行开始每三行选择一行:$sed'1p'example.txtthellohelloworldThisislinethree.Hereisthefinalline.Hereisthefinalline.您可以使用$作为行定位的选择,只对文件的最后一行进行操作:$sed'$p'example.txthelloworld这是第三行。这是最后一行。这是最后一行。在GNUsed中,您可以选择多行(例如,sed'1,$p'打印第一行和最后一行)。要反转任何数字或位置选择,您可以使用感叹号(!)字符反转。下面将选择除第一行以外的所有行:$sed'1!p'example.txthelloworldworld这是第三行。这是第三行。这是最后一行。这是最后一行。模式匹配您可以将模式匹配视为文字处理器或浏览器中的查找操作。你提供一个词(一个模式),然后你选择结果。模式匹配的语法是/pattern/:$sed'/hello/p'example.txtthellohelloworld这是第三行。这是最后一行。$sed'/line/p'example.txtthelloworld这是第三行。这是第三行.这是最后一行。这是最后一行。使用Sed进行编辑一旦找到要编辑的内容,就可以随心所欲地进行编辑。您可以使用sed中的命令来执行编辑。sed中的命令不是sed命令本身。如果有帮助,可以将它们视为“动作”或“动词”或“指令”。sed中的命令是单个字母,例如前面示例中使用的print命令的p。一开始可能很难记住它们,但就像所有事物一样,您会通过练习来了解它们。p代表printp命令打印当前模式空间中的任何内容。d用于删除d命令删除模式空间:$sed'$d'example.txthelloworldThisisthelinethree.$sed'1d'example.txtworldThisislinethree.Hereisthefinalline.s用于搜索并替换s命令搜索模式并将其替换为其他内容。这可能是sed最流行和最随意的用法,而且它通常是用户学习的第一个(有时是唯一的)sed命令。它几乎肯定是文本编辑中最有用的命令:$sed's/world/opensource.com/'example.txthelloopensource.com这是第三行。这是最后一行。在您的替换文本中,还使用一些特殊功能。例如,\L将替换文本转换为小写,而\l仅转换下一个字符。还有其他功能,列在sed文档中(可以使用infosed命令查看)。替换子句中的特殊字符&指的是匹配的模式:$sed's/is/\U&/'example.txthelloworldThIS是第三行。这是最后一行。您还可以使用特殊标志影响s如何处理它找到的内容。g(应该表示全局)标志告诉s对行中找到的所有匹配项进行替换,而不仅仅是第一个:$sed's/is/\U&/g'example.txthelloworldThISIS第三行。这是最后一行。其他重要标志包括使用数字指示匹配模式以影响第一次出现:$sed's/is/\U&/2'example.txthelloworldThisISlinethree.Hereisthefinalline.wflag,followedbyafilename,_only_如果有变化,匹配的行将被写入文件:$sed's/is/\U&/wsed.log'example.txtthelloworldThisislinethree.HereISthefinalline.$catsed.logThIS是第三行。这是最后一行。标志可以组合:$sed's/is/\U&/2wsed.log'example.txtthelloworldThisIS第三行。这是最后一行。$catsed.log这是第三行。脚本有许多带有sed“单行代码”的很棒的站点,它们为您提供面向任务的sed命令来解决常见问题。但是,自己学习sed将允许您编写自己的单行代码,这些代码可以根据您的具体需要进行定制。sed的脚本可以在终端中写成一行,或者保存到一个文件中,然后用sed本身执行。我倾向于将小脚本编写为一个命令,因为我发现自己在现实生活中很少重复使用sed命令。当我写一个sed脚本时,它通常是针对一个文件的。例如,在写完这篇文章的初稿后,我使用sed规范化了“sed”的大小写,这是我可能永远不会再做的任务。您可以向sed发出一系列不同的命令,以分号(;)分隔。$sed'3t;s/line/\U&/'example.txthelloworld这是LINE3。这是最后一行。括号内的范围更改您还可以使用大括号({})来限制受影响的结果。当您用花括号将sed命令括起来时,它们仅适用于特定选择。例如,单词“line”出现在示例文本的两行中。您可以强制sed仅影响最后一行,方法是声明所需的匹配条件($表示最后一行),然后在括号中声明您希望执行的s命令:$sed'${s/line/\U&/}'示例.txtthelloworld这是第三行。这是最后一行。学习Sed您可以使用sed做比本文中介绍的更多的事情。我什至没有介绍分支(b)、测试(t)、保留空白(H)和许多其他功能。与ed一样,sed可能不是您想要用来创建文档的文本编辑器,甚至也不是您需要执行的每个脚本任务的文本编辑器,但对于POSIX用户来说,它是一个强大的选择。学习sed命令的结构以及如何编写简短的脚本可以快速修改大量文本。阅读GNUsed信息页或BSDsed手册页,了解sed能为您做些什么。
