sed 命令

来源:互联网 发布:长期避孕药的危害知乎 编辑:程序博客网 时间:2024/04/29 23:21

 

 

 

 

命令参考大全,卷 5,s - u

sed 命令

用途

提供流编辑器。

语法

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/

    / (反斜杠) 字符不是必需的。

  • /n 序列与模式空间中的换行符(除了终止的换行符)相匹配。
  • .(句点)与除终止的换行符之外的任何字符匹配。也就是说,与 ed 命令不同(ed 命令不能匹配行中间的换行符),sed 命令能够匹配模式空间中的换行符。

某些叫做 addressed 的命令允许您指定该命令适用的一行或多行。下列的规则适用于寻址命令:

  • 没有地址的命令行选择每一行。
  • 具有以上下文格式表示的一个地址的命令行选择与该地址匹配的每一行。
  • 具有以逗号分离的两个地址的命令行选择从与第一个地址匹配的第一行到与第二个地址匹配的下一行之间的整个范围。(如果第二个地址小于或等于第一个选择的行号,那么只会选择一行。)此后就会重复这个过程以再次寻找第一个地址。

标志

 

-e Script使用 Script 变量作为编辑脚本。如果您只使用一个 -e 标志并且不使用-f 标志,则可以省略 -e 标志。-f ScriptFile使用 ScriptFile 变量作为编辑脚本源文件。ScriptFile 变量是适用于 File 参数的一组准备好的编辑命令。-n禁止所有正常地写到标准输出的信息。

 

注:您可以指定多个 -e-f 标志。按指定的顺序将所有的子命令添加到脚本中,而不管其来源。

sed 子命令

sed 命令包含下列的 sed 脚本子命令。子命令前圆括号内的数字表示子命令可允许的地址的最大数。

 

注:
  1. 只要除了最后一行以外的所有行以引用换行符 / (反斜杠) 来结束,则带有 a/c/ 以及 i/ 子命令的 Text 变量就可以超过一行。文本中的反斜杠被视为 s 命令的替换字符串中的反斜杠,并且能够用于保护初始的空格和制表符免于在处理每个脚本行时被去除。RFileWFile 变量必须结束命令行,并且前面必须正好有一个空格。在开始处理前创建每个 WFile 变量。
  2. sed 命令能够处理模式文件中多达 999 个子命令。

 

(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 变量的值必须是零或大于零:

g
                         
代替 pattern 参数的所有不重叠的实例,而不仅仅是第一个实例。
n
仅代替第 n 次出现的 pattern 参数。
p
如果进行了替代,则将模式空间写到标准输出。
w WFile
如果进行了替换,将模式空间写到 WFile 变量。将模式空间附加到 WFile 变量中。如果 sed 脚本的前一次写入还没有创建 WFile 变量,则 sed 命令就会创建它。
(2)tlabel如果自从读取执行 t 子命令的输入行以来做了任何替代,则转移到该脚本文件中的 :label 变量。如果您不指定 label 变量,则控制转移到脚本的结尾。(2)wWFile将模式空间附加到 WFile 变量中。(2)x交换模式空间和保留空间的内容。(2)y/pattern1/pattern2/                         将所有 pattern1 变量中出现的字符替换为相应的 pattern2 字符。在 pattern1pattern2 变量中的字符数必须相等。换行符用 /n 表示。(2)!sed-cmd只将指定的 sed 子命令应用于未被地址选择的行。(0):label标记 bt 子命令所引用的分支点。该标号可以是任何八个或更少字节的序列。(1)=将当前行号作为一行写到标准输出。(2){subcmd . . . }将 {} (花括号) 括起的子命令分组。(0)忽略空命令。(0)#如果 #(镑符)是出现在脚本文件的某行的第一个字符,则将整个行视为注释,但有一个例外。 只对脚本文件的第一行来说,如果在 # 后的字符是 n,就会禁止缺省的输出。忽略 #n 之后的行的剩余部分。

退出状态

该命令返回以下出口值:

0成功完成。>0发生错误。

示例

  1. 要执行全局更改,请输入:

     

    sed  "s/happy/enchanted/g" chap1  >chap1.new

    该命令序列用单词 enchanted 替换每个在文件 chap1 中出现的单词 happy。它将已编辑的版本写入名为 chap1.new 的单独文件中。s 子命令结尾的 g 字符告诉 sed 命令在每行作尽可能多的替代。如果没有 g 字符,则 sed 命令只会替换行中首次出现的单词 happy

    sed 命令作为过滤器操作。它从标准输入或命令行指定的文件中(本例中是 chap1)读取文本、修改文本、并将其写到标准输出。不同于大多数的编辑器,它不替换原始文件。这会使 sed 命令在用于管道时成为一个强大的命令。

  2. 要在管道中将 sed 命令作为过滤器使用,请输入:

     

    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq

    该命令序列在打印文件 chap2 之前将页码包含在圆括号中。pr 命令将标题和页码放置在每页的顶部,然后 sed 命令将页码放在圆括号中,enq 命令打印已编辑的列表。

    sed 命令模式 /Page *[0-9]*$/ 与在行尾出现的页码相匹配。s 子命令将其更改为 (&),其中 & 代表匹配的页码。

  3. 要显示文件的选定的行,请输入:

     

    sed  -n  "/food/p" chap3

    sed -n 显示文件 chap3 中包含单词 food 的每一行。通常,sed 命令将编辑过的每行复制到标准输出。-n 终止 sed 命令进行该操作。然后,您使用子命令(如 p )写入文本的特定部分。如果没有 -n 标志,该示例会显示文件 chap3 中的所有行,并显示两次包含 food 的每个行。

  4. 要执行复杂的编辑,请输入:

     

    sed  -f  script.sed  chap4  >chap4.new

    当您想做任何复杂的编辑时,该命令序列创建一个 sed 脚本文件。然后,您可以在使用该脚本之前对其进行测试和修改。您也可以重用脚本来编辑其它文件。用交互式文本编辑器创建脚本文件。

  5. 样本 sed 脚本文件:

     

    :join///$/{Ns////n//b join}

    sed 脚本将每个以 / (反斜杠) 结束的行连接到其后的行上。首先,模式  ///$/ 选择以 / 结束的行,其用于分组以 {} (花括号) 括起的命令。然后,N 子命令附加下一行,嵌入换行符。s////n// 删除 / 和嵌入的换行符。最后,b join 转移回到标号 :join 以在新连接的行末检查 。如果没有转移,那么 sed 命令在检查第二个  / 之前写入连接的行并读取下一行。

     

    注:如果没有更多的输入行的话(也就是说,如果 N 子命令读取文件结束符的话),N 子命令将导致 sed 命令立刻停止。在停止前它不将模式空间复制到标准输出。这意味着如果输入的最后行结束于 / , 就不将其复制到输出。
  6. 要将现有的文件(oldfile)复制到新的文件(newfile),并将所有出现 testpattern 文本字符串替换为 $REPL shell 变量的内容,请输入:

     

    cat oldfile | sed -e "s/testpattern/$REPL/g" > newfile

相关信息

awk 命令、ed 命令以及 grep 命令。

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。