在 sed 命令的开头可以使用哪些命令?

在 sed 命令的开头可以使用哪些命令?

sed我最初学会了像这样进行搜索和替换:

sed -e 's/<stuff>/<replacement>/'

但是我最近了解到,根据您在开始时使用的命令字符(而不是s),这些命令会执行不同的操作。例如:

sed -e 'g/<stuff>/<??>/'

您可以在脚本开头使用哪些不同的命令sed,它们的作用是什么?

答案1

我已将此答案作为社区维基帖子,因为它包含不属于我自己的工作。请随意为这个答案做出贡献。

您看到的字母称为命令。有几十个。要完全理解它们,您必须首先了解一些有关sed的语法和术语。sed有关 的术语(包括术语 pattern space和 )的解释hold space,请参阅来自 StackOverflow 的回答。

sed 语法如下所示:

[address or range]command

您可以通过用换行符或分号分隔来连续运行多个命令(尽管有些命令必须用换行符分隔)。

命令分为三种类型。

  1. 那些不接受地址或范围的。
  2. 那些接受一个地址或不接受任何地址的。
  3. 那些接受地址范围的。

sed您将在下面找到联机帮助页中几乎完整的命令列表sed(1) 。我正在努力为这些命令提供更好的解释。

零地址或一地址命令

这些是命令

  • =- 打印当前行号。
  • a \<text>- 追加文本,其中每个嵌入的换行符前面都有一个反斜杠。
  • i \<text>- 插入文本,每个嵌入的换行符前面都有一个反斜杠。
  • q [exit-code]- 立即退出 sed 脚本而不处理任何更多输入,除非自动打印未禁用,否则将打印当前模式空间。退出代码参数是 GNU 扩展。
  • Q [exit-code]- 立即退出 sed 脚本,不再处理任何输入。这是一个 GNU 扩展。
  • r filename- 附加从文件名读取的文本。
  • R filename- 附加从文件名读取的行。该命令的每次调用都会从文件中读取一行。这是一个 GNU 扩展。

地址范围命令

  • b label- 分支到标签;如果省略标签,则分支到脚本末尾。
  • c \ text- 替换这里有一些(取自sed(1)联机帮助页,格式化并稍作修改):用文本选定的行,其中每个嵌入的换行符前面都有一个反斜杠。
  • d- 删除模式空间。开始下一个周期。
  • D- 如果模式空间不包含换行符,则启动正常的新循环,就像发出 d 命令一样。否则,删除模式空间中直到第一个换行符的文本,并使用生成的模式空间重新启动循环,而不读取新的输入行。
  • h H- 复制/追加模式空间以保存空间。
  • g G- 将保留空间复制/附加到模式空间。
  • l- 以“视觉上明确”的形式列出当前行。
  • l <width>- 以“视觉上明确”的形式列出当前行,按字符分隔。这是一个 GNU 扩展。
  • n N- 将下一行输入读取/附加到模式空间中。
  • p- 打印当前模式空间。
  • P- 打印到当前模式空间的第一个嵌入换行符。
  • s/regexp/replacement/- 尝试将正则表达式与模式空间进行匹配。如果成功,则替换与替换匹配的部分。替换可能包含特殊字符 & 来引用模式空间中匹配的部分,以及特殊转义符 \1 到 \9 来引用正则表达式中相应的匹配子表达式。
  • t label- 如果 s///自上次读取输入行以来以及自上次 t 或 T 命令以来命令已成功替换,则分支到标签;如果省略标签,则分支到脚本末尾。
  • T label- 如果s///自上次读取输入行以来以及自上次 t 或 T 命令以来没有命令成功完成替换,则分支到标签;如果省略标签,则分支到脚本末尾。这是一个 GNU 扩展。
  • w filename- 将当前模式空间写入文件名。
  • W filename- 将当前模式空间的第一行写入文件名。这是一个 GNU 扩展。
  • x- 交换保持空间和模式空间的内容。
  • y/source/dest/- 将源中出现的模式空间中的字符音译为目标中相应的字符。

有关这些命令的更多信息,请参阅 sed文本信息手册

关于范围的注释

某些 sed 命令接受地址或地址范围。例如,

sed 1p

将打印 sed 输入的第一行。

sed /foo/p

将打印包含单词 的所有行foo

sed /foo/,/bar/p

将打印从foo到 的所有行bar。请注意,这可能会匹配多次。例如,

$ cat file
foo
baz
bar
baz
foo
bar
$ sed -n /foo/,/bar/p

会打印

foo
baz
bar
foo
bar

相关内容