sed [ -n ] Script [ File ... ]
sed [ -n ] [ -e Script ] ... [ -f ScriptFile ] ... [ File ... ]
sed 命令根据编辑脚本修改来自指定的 File 参数的行,并将其写到标准输出。sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改。
sed 命令使用两个工作空间来保留修改的行:保留选定行的模式空间和暂时存储行的保留空间。
编辑脚本由单独的子命令构成,每个单独的行上有一个子命令。sed 子命令的一般格式如下:
[address-range] function[modifiers]
sed 命令通过将一个输入行读入方式空间,依次应用所有的 sed 子命令(这些子命令的地址选择了该行),并将方式空间写到标准输出来处理每个输入的 File 参数。然后清除方式空间,并对在输入的 File 参数中指定的每行重复该过程。一些 sed 子命令使用保留空间来保存后继检索的所有或部分模式空间。
当命令包含地址(行号或搜索模式)时,该命令只会对被寻址的行起作用。否则,该命令适用于所有的行。
地址是十进制行号、$(美元符号),它表示输入的最后行的地址或上下文地址。上下文地址是与 ed 命令中所使用的表达式相似的正则表达式,除了具有以下的差别之外:
\?pattern?
其中 ? (问号)是可选择的字符定界符。除了空格或换行符,您可以从当前的语言环境中选择任何字符。仅在第一次出现 ? 时要求 \ (反斜杠)字符
模式的缺省格式如下:
/pattern/
\ (反斜杠) 字符不是必需的。
某些叫做 addressed 的命令允许您指定该命令适用的一行或多行。下列的规则适用于寻址命令:
-e Script | 使用 Script 变量作为编辑脚本。如果您只使用一个 -e 标志并且不使用-f 标志,则可以省略 -e 标志。 |
-f ScriptFile | 使用 ScriptFile 变量作为编辑脚本源文件。ScriptFile 变量是适用于 File 参数的一组准备好的编辑命令。 |
-n | 禁止所有正常地写到标准输出的信息。 |
注:您可以指定多个 -e 和 -f 标志。按指定的顺序将所有的子命令添加到脚本中,而不管其来源。
sed 命令包含下列的 sed 脚本子命令。子命令前圆括号内的数字表示子命令可允许的地址的最大数。
注:
(1) a\ | |
Text | 在读取下一个输入行之前将 Text 变量放在输出中。 |
(2)b[label] | 转移到具有label 变量的 : 命令。如果 label 变量为空,则转移到脚本的结尾。 |
(2)c\ | |
Text | 删除模式空间。用 0 或 1 地址或 2 地址范围的结尾将 Text 变量放置在输出中,然后开始下一个周期。 |
(2)d | 删除模式空间,然后开始下一个周期。 |
(2)D | 删除通过第一个换行符的模式空间的初始段,然后开始下一个周期。 |
(2)g | 用保留空间的内容替换模式空间的内容。 |
(2)G | 将保留空间的内容附加到模式空间。 |
(2)h | 用模式空间的内容替换保留空间的内容。 |
(2)H | 将模式空间的内容附加到保留空间。 |
(1)i\ | |
Text | 在将下一行读到模式空间之前将 Text 变量写到标准输出。 |
(2)l | 将模式空间写到标准输出中,将不可显示字符以 4 位十六进制值显示。将长行折起来。 |
(2)l | 以肉眼明确的格式将模式空间写到标准输出。将字符 \\\, \\a, \\b, \\f, \\r, \\t 以及 \\v 以对应的转义序列写出。对于非打印字符字符,将其字符中的每个字节都以一个 3 位八进制数(前面具有反斜杠字符)写出(最重要的字节优先)。该格式也用于多字节字符。该子命令折叠长行。跟在换行符后面的反斜杠表示折叠点。折叠出现在第 72 列位置。$(美元符号)标记每行的结束。 |
(2)n | 如果不禁止缺省的输出,则将模式空间写到标准输出。它用输入的下一行替换模式空间。 |
(2)N | 使用嵌入式换行符(更改当前的行号)将输入的下一行附加到模式空间。您可以用它来搜索分割成两行的模式。 |
(2)p | 将模式空间写到标准输出。 |
(2)P | 删除通过第一个换行符的模式空间的初始段写到标准输出。 |
(1)q | 转移到脚本的结尾。它不启动新的周期。 |
(2)r RFile | 读取 RFile 变量的内容。在读取下一输入行之前将内容放置到输出。 |
(2)s/pattern/replacement/flags | |
用 replacement 字符串代替在模式空间中首次出现的 pattern 参数。除了空格或换行符,在 s 子命令之后显示的任何字符都能代替 /(斜杠)分隔符。
请参阅 ed 命令的“模式匹配”部分。 flags 变量的值必须是零或大于零: |
|
(2)tlabel | 如果自从读取执行 t 子命令的输入行以来做了任何替代,则转移到该脚本文件中的 :label 变量。如果您不指定 label 变量,则控制转移到脚本的结尾。 |
(2)wWFile | 将模式空间附加到 WFile 变量中。 |
(2)x | 交换模式空间和保留空间的内容。 |
(2)y/pattern1/pattern2/ | |
将所有 pattern1 变量中出现的字符替换为相应的 pattern2 字符。在 pattern1 和 pattern2 变量中的字符数必须相等。换行符用 \n 表示。 | |
(2)!sed-cmd | 只将指定的 sed 子命令应用于未被地址选择的行。 |
(0):label | 标记 b 和 t 子命令所引用的分支点。该标号可以是任何八个或更少字节的序列。 |
(1)= | 将当前行号作为一行写到标准输出。 |
(2){subcmd | |
. | |
. | |
. | |
} | 将 {} (花括号) 括起的子命令分组。 |
(0) | 忽略空命令。 |
(0)# | 如果 #(镑符)是出现在脚本文件的某行的第一个字符,则将整个行视为注释,但有一个例外。 只对脚本文件的第一行来说,如果在 # 后的字符是 n,就会禁止缺省的输出。忽略 #n 之后的行的剩余部分。 |
该命令返回以下出口值:
0 | 成功完成。 |
>0 | 发生错误。 |
sed "s/happy/enchanted/g" chap1 >chap1.new
该命令序列用单词 enchanted 替换每个在文件 chap1 中出现的单词 happy。它将已编辑的版本写入名为 chap1.new 的单独文件中。s 子命令结尾的 g 字符告诉 sed 命令在每行作尽可能多的替代。如果没有 g 字符,则 sed 命令只会替换行中首次出现的单词 happy。
sed 命令作为过滤器操作。它从标准输入或命令行指定的文件中(本例中是 chap1)读取文本、修改文本、并将其写到标准输出。不同于大多数的编辑器,它不替换原始文件。这会使 sed 命令在用于管道时成为一个强大的命令。
pr chap2 | sed "s/Page *[0-9]*$/(&)/" | enq
该命令序列在打印文件 chap2 之前将页码包含在圆括号中。pr 命令将标题和页码放置在每页的顶部,然后 sed 命令将页码放在圆括号中,enq 命令打印已编辑的列表。
sed 命令模式 /Page *[0-9]*$/ 与在行尾出现的页码相匹配。s 子命令将其更改为 (&),其中 & 代表匹配的页码。
sed -n "/food/p" chap3
sed -n 显示文件 chap3 中包含单词 food 的每一行。通常,sed 命令将编辑过的每行复制到标准输出。-n 终止 sed 命令进行该操作。然后,您使用子命令(如 p )写入文本的特定部分。如果没有 -n 标志,该示例会显示文件 chap3 中的所有行,并显示两次包含 food 的每个行。
sed -f script.sed chap4 >chap4.new
当您想做任何复杂的编辑时,该命令序列创建一个 sed 脚本文件。然后,您可以在使用该脚本之前对其进行测试和修改。您也可以重用脚本来编辑其它文件。用交互式文本编辑器创建脚本文件。
:join /\\$/{N s/\\\n// b join }
sed 脚本将每个以 \ (反斜杠) 结束的行连接到其后的行上。首先,模式 /\\$/ 选择以 \ 结束的行,其用于分组以 {} (花括号) 括起的命令。然后,N 子命令附加下一行,嵌入换行符。s/\\\n// 删除 \ 和嵌入的换行符。最后,b join 转移回到标号 :join 以在新连接的行末检查 \ 。如果没有转移,那么 sed 命令在检查第二个 \ 之前写入连接的行并读取下一行。
注:如果没有更多的输入行的话(也就是说,如果 N 子命令读取文件结束符的话),N 子命令将导致 sed 命令立刻停止。在停止前它不将模式空间复制到标准输出。这意味着如果输入的最后行结束于 \ , 就不将其复制到输出。
cat oldfile | sed -e "s/testpattern/$REPL/g" > newfile
AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的 Manipulating Strings with sed。
AIX 5L Version 5.2 National Language Support Guide and Reference 中的 National Language Support。