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
您可以通过用换行符或分号分隔来连续运行多个命令(尽管有些命令必须用换行符分隔)。
命令分为三种类型。
- 那些不接受地址或范围的。
- 那些接受一个地址或不接受任何地址的。
- 那些接受地址范围的。
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