sed 命令

用途

流编辑器。

语法

[ -n ] [ -u ] 脚本  [ 文件 ... ]

sed [ -n ] [ -u ] [ -e Script ] ... [ -f ScriptFile ] ... [ File ... ]

描述

sed 命令根据编辑脚本修改来自指定的 File 参数的行,并将其写到标准输出。 sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改。

sed 命令使用两个工作空间来保留修改的行:保留选定行的模式空间和暂时存储行的保留空间。

编辑脚本由单独的子命令构成,每个单独的行上有一个子命令。 sed 子命令的一般格式如下:

[地址范围] 功能[修饰符]

命令通过将输入行读入模式空间,按其地址选择该行的顺序应用所有 子命令,并将模式空间写入标准输出来处理每个输入 文件 参数。 然后清除方式空间,并对在输入的 File 参数中指定的每行重复该过程。 一些 sed 子命令使用保留空间来保存后继检索的所有或部分模式空间。

当命令包含地址(行号或搜索模式)时,该命令只会对被寻址的行起作用。 否则,该命令适用于所有的行。

地址是十进制行号、$(美元符号),它表示输入的最后行的地址或上下文地址。 上下文地址是与 ed 命令中所使用的表达式相似的正则表达式,除了具有以下的差别之外:

  • 您可以选择模式的字符定界符。 表达式的一般格式是:
    \?pattern?
    在哪里 (问号)是可选择的字符定界符。 除了空格或换行符,您可以从当前的语言环境中选择任何字符。 仅在第一次出现 ?(问号) 时要求使用 \(反斜杠) (问号)。

    模式的缺省格式如下:

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

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

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

标志

描述
-e 脚本 使用 Script 变量作为编辑脚本。 如果您只使用一个 -e 标志并且不使用 -f 标志,那么可以省略 -e 标志。
-f ScriptFile 使用 ScriptFile 变量作为编辑脚本源文件。 ScriptFile 变量是适用于 File 参数的一组准备好的编辑命令。
-n 禁止所有正常地写到标准输出的信息。
-U 以未缓存的方式显示输出。 设置了此标志时,sed 命令会即时显示输出,而不会缓存输出。 缺省情况下为缓存方式。
注: 您可以指定多个 -e- 标志。 按指定的顺序将所有的子命令添加到脚本中,而不管其来源。

sed 子命令

sed 命令包含下列的 sed 脚本子命令。 子命令前圆括号内的数字表示子命令可允许的地址的最大数。
注意:
  1. a \Ci \ 子命令一起使用的 文本 变量可以继续到多行,前提是除最后一行之外的所有行都使用 \ (反斜杠) 来对换行符进行引号。 文本中的反斜杠被视为 s 命令的替换字符串中的反斜杠,并且能够用于保护初始的空格和制表符,以避免在处理每个脚本行时被去除。 RFileWFile 变量必须结束命令行,并且前面必须正好有一个空格。 在开始处理前创建每个 WFile 变量。
  2. sed 命令可以在模式文件中处理最多 999 个子命令。
描述
(1) a \文本 在读取下一个输入行之前将 Text 变量放在输出中。
(2)b [标签] 转至包含 标签 变量的 : 命令。 如果 label 变量为空,那么转移到脚本的结尾。
(2)C文本 删除模式空间。 用 0 或 1 地址或 2 地址范围的结尾将 Text 变量放置在输出中,然后开始下一个周期。
(2)D 删除模式空间,然后开始下一个周期。
(2 )D 删除通过第一个换行符的模式空间的初始段,然后开始下一个周期。
(2)G 用保留空间的内容替换模式空间的内容。
(2 )G 将保留空间的内容附加到模式空间。
(2)H 用模式空间的内容替换保留空间的内容。
(2 )H 将模式空间的内容附加到保留空间。
(1)i \文本 在将下一行读到模式空间之前将 Text 变量写到标准输出。
(2) 将模式空间写到标准输出,将不可显示字符以 4 位十六进制值显示。 将长行折起来。
(2) 以肉眼明确的格式将模式空间写到标准输出。 将字符 \\\, \\a, \\b, \\f, \\r, \\t 以及 \\v 以对应的转义序列写出。 对于非显示字符字符,将其字符中的每个字节都以一个 3 位八进制数(前面具有反斜杠字符)写出(最重要的字节优先)。 该格式也用于多字节字符。 该子命令折叠长行。 跟在换行符后面的反斜杠表示折叠点。 折叠出现在第 72 列位置。 $(美元符号)标记每行的结束。
(2)N 如果不禁止缺省的输出,那么将模式空间写到标准输出。 它用输入的下一行替换模式空间。
(2 )N 使用嵌入式换行符(更改当前的行号)将输入的下一行附加到模式空间。 您可以用它来搜索分割成两行的模式。
(2)P 将模式空间写到标准输出。
(2 )P 删除通过第一个换行符的模式空间的初始段写到标准输出。
(1)Q 转移到脚本的结尾。 它不启动新的周期。
(2)R RFile 读取 RFile 变量的内容。 在读取下一输入行之前将内容放置到输出。
(2)S/模式/替换/标志 replacement 字符串代替在模式空间中首次出现的 pattern 参数。 除了空格或换行符,在 s 子命令之后显示的任何字符都能代替 /(斜杠)分隔符。

请参阅 ed 命令的模式匹配部分。

flags 变量的值必须是零或大于零:

g
代替 pattern 参数的所有不重叠的实例,而不仅仅是第一个实例。
n
仅代替第 n 次出现的 pattern 参数。
p
如果进行了替代,那么将模式空间写到标准输出。
W WFile
如果进行了替换,将模式空间写入 WFile 变量。 将模式空间附加到 WFile 变量中。 如果此 脚本先前的写操作尚未创建 WFile 变量,那么 命令将创建此变量。
(2)标签 如果自最近一次读取 子命令的输入行执行以来进行了任何替换,那么将分支到脚本文件中的 :标签 变量。 如果未指定 label 变量,那么控制转移到脚本的结尾。
(2)WWFile 将模式空间附加到 WFile 变量中。
(2)X 交换模式空间和保留空间的内容。
(2) y/ 模式1 / 模式2 / 将所有 pattern1 变量中出现的字符替换为相应的 pattern2 字符。 在 pattern1pattern2 变量中的字符数必须相等。 换行符用 \n 表示。
(2)! sed-cmd 只将指定的 sed 子命令应用于未被地址选择的行。
(0):标签 标记 bt 子命令所引用的分支点。 该标号可以是任何八个或更少字节的序列。
(1 )= 将当前行号作为一行写到标准输出。
(2){子命令 } 将 {} (花括号) 括起的子命令分组。
(0) 忽略空命令。
(0 )# “#”及该行的余下部分被忽略(被视为注释),但有一种情况例外。 对于脚本文件的第一行,如果 # 之后的字符为 n,那么缺省输出被禁止。 #n 之后的行的余下部分被忽略。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 成功完成。
>0 发生错误。

示例

  1. 要执行全局更改,请输入:
    sed  "s/happy/enchanted/g" chap1  >chap1.new
    此命令序列将替换每次出现的单词happy在文件中找到chap1用这个词enchanted它将编辑后的版本放置在一个单独的文件中chap1.new. S 子命令末尾的 G 字符指示 命令在每一行中进行尽可能多的替换。 如果不使用 G 字符,那么 命令仅替换第一次出现的单词happy在线上。

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

  2. 要在管道中将 sed 命令作为过滤器使用,请输入:
    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq
    在打印文件之前,此命令序列将页码括在括号中chap2普雷 命令将标题和页码放置在每个页面的顶部,然后 命令将页码放置在括号中, 恩格 命令将显示编辑后的列表。

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

  3. 要显示文件的选定行,请输入:
    sed  -n  "/food/p" chap3
    sed -n显示文件中的每一行chap3包含单词的food. 通常, 命令会在编辑后将每一行复制到标准输出。 -n 终止 sed 命令进行该操作。 然后,您使用子命令(如 p )写入文本的特定部分。 如果不使用 -n 标志,那么此示例将显示文件中的所有行chap3,并且显示包含以下内容的每一行:food两次
  4. 要执行复杂的编辑,请输入:
    sed  -f  script.sed  chap4  >chap4.new
    当您想做任何复杂的编辑时,该命令序列创建一个 sed 脚本文件。 然后,您可以在使用该脚本之前对其进行测试和修改。 您也可以重用脚本来编辑其他文件。 用交互式文本编辑器创建脚本文件。
  5. 样本 sed 脚本文件:
    :join
    /\\$/{N
    s/\\\n//
    b join
    }
    sed 脚本将每个以 \(反斜杠)结束的行连接到其后的行上。 首先,模式 /\\$/ 选择以一个\用于包含在以下命令中的命令组:{}(花括号)。 然后,N 子命令附加下一行,嵌入换行符。 该s/\\\n//删除\以及嵌入新行字符。 最后,b join分支返回到标签:join以检查在新加入的线的末端。 如果没有分支, 命令将写入连接的行并读取下一个行,然后再检查第二个 \.
    注: 如果没有更多的输入行 (即,如果 N 子命令读取文件结束符) ,那么 N 子命令将导致 命令立即停止。 在停止前它不将模式空间复制到标准输出。 这意味着如果输入的最后行结束于 \ , 就不将其复制到输出。
  6. 要复制现有文件 (oldfile) 到新文件 (newfile) 并替换所有出现的testpattern包含内容的文本字符串$REPLshell 变量,输入:
    cat oldfile | sed -e "s/testpattern/$REPL/g" > newfile
  7. 要替换输入文件中出现的所有带有 a 的 A、带有 b 的 B、带有 c 的 C 和出现的所有带有字符 Z 的换行,请输入:
    $ sed -f command.file input.file
    其中 command.file 是脚本文件,input.file 是输入文件。
       $cat command.file
       y/ABC\n/abcZ/
    另外,还可以执行以下命令来获取相同的功能:
    sed "y/ABC\n/abcZ/" input.file