文档库 最新最全的文档下载
当前位置:文档库 › sed命令详解

sed命令详解



--------------------------------------------------------------------------------

intel,ibm,hp,dell,acer,操作系统研究,服务器配置,优化,数据库,程序设计,虚拟机,网络技术,linux, redhat, centos, debian, freebsd,with, web, unix, xhtml, css, mysql, php, cisco,route,switch, 教程, 学习笔记,博客,lamp,bash,c,虚拟化,工具,数据库,vmware,linux unix mysql php redhat centos debian freebsd 教程 文档,操作系统,CentOS,RedHat,FreeBSD,Debian,Ubuntu,嵌入式系统,Linux,Windows,服务器,Web Server,DNS Server,MailServer,FTP Server,Iptables,Squid,OpenSSH,数据库,MySQL,Oracle,PostgreSQL,SQLite,程序设计,PHP,Shell,linux C,网页制作,虚拟机,VMware,Xen,Virtuozzo,QEMU,Bochs,SkyEye,网络技术,TCP/IP,路由交换
1.简介
sed是源于行编辑器ed的非交互式的流(stream-oriented)编辑器。sed之所以称为“流”编辑器,是因为象大多数UNIX程序一样,输入流过它,然后被导向标准输出。sed编辑器逐行处理文件(或输入),把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行后将其从模式空间中删除,然后读入下一行进行处理和输出。sed是对文件副本进行编辑和修改,所以不用担心会修改或破坏原文件。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作和编写转换程序等。

2. 使用格式
sed的使用格式如下:
sed [-n] [-e] ‘instruction’ file(s)
sed [-n] –f scriptfile file(s)
sed的instruction格式如下:
[address[,address]][!]command [arguments]

3.选项
sed的主要选项有:
选 项 功 能

-n 取消默认的输出

-e 允许多行编辑

-f 指定sed脚本文件名

-i[SUFFIX] 修改原文件,如果提供suffix,作备份

-r 使用扩展正则表达式

4. 指令地址
sed指令可以指定0、1或2个地址:
0)命令应用于所有行;
1)命令令应用于任何符合这一地址的行
2)命令应用与从第1个地址到第2个地址之间的行
5. 命令(command)
sed的命令主要有:
命 令 功 能

d 删除行

p 打印行

! 对所选行之外的所有行应用命令

= 打印行号

s 替换命令(如’s/^west/north/g’)注意查找替换分隔符不必是’/’,而可以是换行符和反斜线外的任何字符(如s#^west#north#g)

r 读文件

w 写文件

a\ 在当前行后添加一行或多行

i\ 在当前行之前插入文本

c\ 用新文本代替当前行中的文本

l 显示模式空间中的内容,显示非打印字符为两字节ASCII码

y 将一字符转换为另一字符(如:[address]y/abc/xyz/)

n 读入下一行,并将其读入模式缓冲区中,任何命令都将应用于下一行

q 结束或退出sed

D

删除多行pattern space中到\n为止

N 将下一行附加到上一行

P 打印到多行pattern space的\n为止

H(h) Hold命令,附加(H)或拷贝(h)pattern space的内容到hold space(暂存区)

G(g) Get命令,附加(拷贝)暂存区的内容到pattern space

x Exchange命令,互换hold space和pattern space的内容

b Branch(跳转)命令([address]b[label])

t Test(测试)命令([address]t[label])

5. sed正则表达式元字符
元字符 使 用

. 除换行(\n)之外的任何字符

* 匹配0或多个前导字符,相当于\{0,\} (如:/*love/)

+ 匹配1或多个前导字符,相当于\{1,\} 注意这是扩展元字符

[...] 匹配指定字符组内的任一字符 (如:/[Ll]ove/

\{n,m\} 匹配至少n个,至多m个前导字符;\{n\} 将匹配正好 n个, \{n,\}将匹配至少n个 (如:/o\{5,10\})

^ 行首定位符

$ 行尾定位符

\ 取消转义字符

\( \) 保存已匹配的字符,最多可定义9个标签(如:s/\(love\)able/\1er/)

\n 获取以上获取的第n个标签

& 保存查找串以便在替代串中引用 (如 s/love/**&**/g)

\< 词首定位符 /\
\> 词尾定位符 /love\>/

6. sed脚本编程
在命令行使用sed时常常会涉及到和shell的交互,而使用sed脚本则完全不必要为此操心。不再用引号来确保sed命令不被shell解释,而且可用反斜杠来续行。另外,对于脚本中的多个指令,应注意sed是对一行使用完了所有指令后再转到下一行的。sed的这种选择使得它可以方便地处理大文件(不必将整个文件一次读进内存)。另外,应注意sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。开始的{后不许有空格,结束的}必须单起一行。这一点与awk的比较自由的使用方式形成对比。sed中使用多行指令的示例如下:
/^\.TS/,/^\.TE/{ /^$/d s/^\.ps 10/.ps 8/ s/^\.vs 12/.vs 10/}

7. sed中使用shell变量
sed如何使用shell变量?比如在shell中定义了一个var变量,如何在sed中调用此变量?可以考虑以下方法:
将平常的单引号改为双引号(Shell里单引号中所有字符都作字面解释):
sed "s/mytext/$var/g" file
对于某些mytext这种方法可能不起作用。

将一个单引号改为两个:
sed 's/mytext/'$var'/g' file

8.理解与补充说明
grep与sed的区别。grep ‘John’ datafile对应的sed命令是sed –n ‘/John/p’ datafile。区别:
(1)使用grep时,正则表达式没有包含在//分隔符中,而sed需要包含在//之间;
(2)sed默认会输出每一行,所以需要用-n命令阻止默认输出;
(3)返回状态。如果grep在文件中找到指定模式,将返回状态0,否则返回1。sed则

管是否找到指定模式,它的退出状态都是0,只有命令存在语法错误时,sed的
退出状态才不是0。
sed为什么要设计得如此“麻烦”呢?初用者在想只输出匹配行时往往忘记加-n选项。
这是因为sed首先是一个编辑器,而不是一个查找工具。比如当我们需要替换文件的
一部分时可以用不加-n选项的sed ‘s/a/b/g’ file实现。

比较sed与ed/vi。理解ed/vi的current-line addressing和sed的global line addressing非常重要:在ed/vi中使用定址来扩展命令处理行;而在sed中使用定址来限制处理的行。在ed/vi中,除非你告诉处理哪些行,不会处理什么,而在sed中,它将工作于每一行除非你告诉它不处理。
关于命令括在单引号中。这不是必须的,但是应养成总是这样做的良好习惯。单引号对可以避免shell解释在编辑指令中出现的特殊字符或空格(shell使用空格来分别提交给程序的不同参数,对于shell的特别字符在命令调用之前被扩展),所以当指令中存在空格时是必须使用单引号的。
sed注释。#用来注释。System V只认第一列的#,而GNU sed则可以将#符号放在任何地方。但是注意,如果第一二个字符是#n 表示脚本不会自动输出结果,相当于指定了一个命令行参数-n。

在命令行中使用多指令的三种方法。(1)在指令之间加分号;(2)在每一指令之前加-e;(3)使用Shell的多行记录功能(前面加’后可以直接换行,shell会等待用户输入’后再解释。

最新版本的-i选项可以很方便地实现多文件直接修改,值得好好注意。


相关文档