<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>meisw's blog</title>
		<link>http://meisw.wdlinux.cn//</link>
		<description>工作,学习,生活,这里将会有一些记录.     备用域名:http://meisw.wdlinux.cn</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Sun, 20 Sep 2026 23:57:20 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://meisw.wdlinux.cn//show-345-1.html</guid>
			<title>Sed简明速查手册</title>
			<author>admin</author>
			<description><![CDATA[<p>Sed(a stream editor)<br />
4个空间:input stream, pattern buffer, output stream和hold buffer<br />
基本操作过程是:<br />
(1).将input stream的当前行放入pattern buffer,然后input stream的指针指向下一行;<br />
(2).对pattern buffer中的行进行处理;<br />
(3).将2的处理结果放入output stream.然后循环这个过程.<br />
<br />
hold buffer是另一个空间,可以通过命令和pattern buffer进行交互.<br />
<br />
sed命令介绍<br />
<br />
1. 基本命令---&quot;替换&quot;: s<br />
&nbsp; 1.1 基本用法<br />
&nbsp; e.g. sed 's/day/night/' &lt;old &gt;new<br />
&nbsp; 该例子将文件old中的每一行第一次出现的day替换成night,将结果输出到文件new<br />
&nbsp; s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;替换&quot;命令<br />
&nbsp; /../../&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分割符(Delimiter)<br />
&nbsp; day&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 搜索字符串<br />
&nbsp; night&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 替换字符串<br />
<br />
&nbsp; 其实,分割符&quot;/&quot;可以用别的符号代替,比如&quot;,&quot;, &quot;|&quot;等.<br />
&nbsp; e.g. sed 's/\/usr\/local\/bin/\/common\/bin/'&lt;old &gt;new<br />
&nbsp; 等价于sed 's_/usr/local/bin_/common/bin_' &lt;old &gt;new<br />
&nbsp; 显然,此时用&quot;_&quot;作分割符比&quot;/&quot;好得多.<br />
<br />
<br />
&nbsp; 1.2 用&amp;表示匹配的字符串<br />
<br />
&nbsp; 有时可能会想在匹配到的字符串周围或附近加上一些字符.<br />
&nbsp; e.g. sed 's/abc/(abc)/' &lt;old &gt;new<br />
&nbsp; 该例子在找到的abc前后加上括号.<br />
&nbsp; 该例子还可以写成 sed 's/abc/(&amp;)/' &lt;old &gt;new<br />
&nbsp; 下面是更复杂的例子:<br />
&nbsp; sed 's/[a-z]*/(&amp;)/' &lt;old &gt;new<br />
&nbsp; sed 's/[0-9]*/&amp; &amp;/' &lt;old &gt;new<br />
<br />
&nbsp; 1.3 用\1, \2, ..., \9来表示匹配的字符串<br />
<br />
&nbsp; e.g. sed 's/\([a-z]*\)[0-9]*/\1/' &lt;old &gt;new<br />
&nbsp; 本例中\1就是指前面的\([a-z]*\)<br />
<br />
&nbsp; sed 's/\([a-z]*\) \([0-9]*\)/\2 \1/' &lt;old &gt;new<br />
&nbsp; 本例中\2和\1分别代表前面的\([0-9]*\)和\([a-z]*\)<br />
<br />
&nbsp; \1, \2, ..., \9也可以出现在搜索字符串中<br />
&nbsp; e.g. sed 's/\([a-z]*\) \1/\1/' &lt;old &gt;new<br />
&nbsp; 本例可以去除重复的由字母组成的词<br />
<br />
&nbsp; 1.4 &quot;替换&quot;选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.1 /g 替换所有的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sed默认只替换搜索字符串的第一次出现,利用/g可以替换搜索字符串所有<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 出现的地方.例如,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sed 's/\([^ ]*\)/(&amp;)/g' &lt;old &gt;new<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.2 用/1, /2, ...来表明替换哪一次出现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g. sed 's/[^ ]*//2' &lt;old &gt;new<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以从/1用到/512<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.3 /p print选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当sed命令有-n选项时,该命令没用输出.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -n配合/p选项后,如果该行确实发生了替换,则输出该行,否则不输出.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.4.4 /w filename 写到文件filename中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g. sed 's/\([0-9]*\) \([a-z]*\)/\2/w new' &lt;old<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该例子把输出放入文件new中<br />
<br />
&nbsp; 1.5 替换和插入换行符号<br />
&nbsp; 替换 (echo a;echo x;echo y) | sed '/x$/ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s:x\n:x:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }'<br />
<br />
&nbsp; 插入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (echo a;echo x;echo y) | sed 's:x:X\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :'<br />
<br />
<br />
<br />
2. 只对特定行的处理<br />
<br />
&nbsp; 2.1 通过行号限定<br />
&nbsp; sed '3 s/[0-9][0-9]*//' &lt;old &gt;new 只处理第3行<br />
<br />
&nbsp; sed '1,100 s/A/a/' &lt;old &gt;new 只处理1到100行<br />
<br />
&nbsp; sed '101,$ s/A/a/' &lt;old &gt;new 处理101到文件的最后一行<br />
<br />
&nbsp; sed '101,$ !s/A/a/' &lt;old &gt;new 这里!表示只对1到100行进行替换,!的作用是取反<br />
<br />
<br />
&nbsp; 2.2 通过正规表达式限定<br />
&nbsp; sed '/start/,/stop/ s/#.*//' &lt;old &gt;new<br />
&nbsp; 本例中,sed先找到有start的行作为开始,找到最近的有stop的行作为结束,对之<br />
&nbsp; 间的行进行操作.<br />
&nbsp; 重复上述过程,直到文件结束<br />
<br />
&nbsp; 下面这个例子是行号和正规表达式配合来限定<br />
&nbsp; sed '1,/start/ s/#.*//' &lt;old &gt;new 对第1行到含有start的行进行处理<br />
<br />
<br />
3. 其他的简单命令<br />
&nbsp; 3.1 删除命令 d<br />
&nbsp; sed '11,$ d' &lt;old &gt;new 删除从11行到文件末尾<br />
&nbsp; sed '/^#/ d' &lt;old &gt;new 删除所有以#开始的行<br />
<br />
&nbsp; 3.2 print命令 p (注意与s命令的/p选项的区别)<br />
&nbsp; sed 'p' &lt;old&nbsp;&nbsp;&nbsp; 每一行将会被输出两次<br />
&nbsp; sed -n 'p' &lt;old 每一行将会输出一次(-n屏蔽掉一次)<br />
&nbsp; sed '/^$/ p' &lt;old 只对空行输出两次,其他只输出一次<br />
&nbsp; sed -n '1,10 p' &lt;old 输出前10行<br />
&nbsp; sed -n '/match/ p' &lt;old 输出含有match的行<br />
<br />
&nbsp; 3.3 quit命令 q<br />
&nbsp; sed '11 q'&lt;old&nbsp;&nbsp;&nbsp; 输出前10行(在第11行退出)<br />
&nbsp; 注意:q命令不能接收多行,例如<br />
&nbsp; sed '2,5 q'&lt;old 是不正确的<br />
<br />
&nbsp; 3.4 写入文件命令 w filename(注意与s命令的/w选项的区别)<br />
&nbsp; 把某些行写入文件filename<br />
&nbsp; sed -n '/^[0-9]*[02468]/ w even' &lt;old&nbsp;&nbsp;&nbsp; 将以偶数开始的行写入文件even<br />
<br />
&nbsp; 3.5 输出行号命令 =<br />
&nbsp; sed -n '/PATTERN/ =' &lt;old 遇到含有PATTERN的行时,同时输出行号<br />
<br />
&nbsp; 3.6 追加,改变,插入新行<br />
&nbsp; 追加命令 a<br />
&nbsp; #!/bin/sh<br />
&nbsp; sed '<br />
&nbsp; /WORD/ a\<br />
&nbsp; Add this line after every line with WORD<br />
&nbsp; '<br />
<br />
&nbsp; 改变命令 c<br />
&nbsp; #!/bin/sh<br />
&nbsp; sed '<br />
&nbsp; /WORD/ c\<br />
&nbsp; Replace the current line with the line<br />
&nbsp; '<br />
<br />
&nbsp; 插入命令 i<br />
&nbsp; #!/bin/sh<br />
&nbsp; sed '<br />
&nbsp; /WORD/ i\<br />
&nbsp; Add this line before every line with WORD<br />
&nbsp; '<br />
<br />
&nbsp; 3.7 变换命令 y<br />
&nbsp; sed 'y/abcdef/ABCDEF/' &lt;old&nbsp; 该例将字符abcdef分别变成大写<br />
<br />
&nbsp; 3.8 将本行的控制符也显示出来的命令 l<br />
&nbsp; sed '1,10 l' &lt;old<br />
<br />
&nbsp; 3.9 d命令和D命令<br />
&nbsp; d命令删除pattern buffer中的内容进入下一次操作循环<br />
&nbsp; D命令删除pattern buffer中第一个换行符之前的内容进入下一次操作循环,如<br />
&nbsp; 果pattern buffer中还有内容,则不用从input stream中读入<br />
<br />
&nbsp; 3.10 p命令和P命令<br />
&nbsp; p命令输出pattern buffer中的内容<br />
&nbsp; P命令输出pattern buffer中第一个换行符之前的内容<br />
<br />
&nbsp; 3.11 n命令和N命令<br />
&nbsp; n命令把下一行读入pattern buffer中(如果没用-n选项,将原来行输出)<br />
&nbsp; N命令把下一行追加到pattern buffer中<br />
<br />
&nbsp;3.12 流程控制命令<br />
&nbsp; b label命令:在指定行跳到label<br />
&nbsp; t label命令:如果在某行发生了替换,跳到label<br />
&nbsp; T label命令:如果在某行没有发生了替换,跳到label<br />
<br />
4. 调用sed时的参数<br />
<br />
&nbsp; 4.1 -e script 执行script这个脚本<br />
&nbsp; e.g. sed -e 's/a/A/' -e 's/b/B/' &lt;old &gt;new<br />
&nbsp; 对每一行分别执行's/a/A/'和 's/b/B/'<br />
<br />
&nbsp; 4.2 -n&nbsp;&nbsp;&nbsp;&nbsp; 禁止输出<br />
&nbsp; 这里的-n与前面的/p配合,可以只输出被修改了的行.<br />
<br />
&nbsp; 4.3 -f scriptname 把scriptname文件中的sed命令加入本次sed的调用中<br />
&nbsp; e.g. sed -f sedscript &lt;old &gt;new<br />
<br />
&nbsp; sedscript的内容可能是这样的:<br />
&nbsp; # sed comment - This script changes lower case vowels to upper case<br />
&nbsp; s/a/A/g<br />
&nbsp; s/e/E/g<br />
&nbsp; s/i/I/g<br />
&nbsp; s/o/O/g<br />
&nbsp; s/u/U/g<br />
<br />
5. Hold Buffer<br />
<br />
&nbsp; x命令:将pattern buffer放入hold buffer,而将hold buffer的内容输出,pattern<br />
&nbsp; buffer的内容变成下一行<br />
&nbsp; h命令:将pattern buffer放入hold buffer,并将pattern buffer的内容输出,<br />
&nbsp; pattern buffer的内容变成下一行<br />
&nbsp; H命令:将pattern buffer追加到hold buffer<br />
&nbsp; g和G命令:g用hold buffer的内容替换pattern buffer的内容,而G将hold buffer内<br />
&nbsp; 容追加到pattern buffer<br />
<br />
参考: http://www.grymoire.com/Unix/Sed.html</p>]]></description>
			<link>http://meisw.wdlinux.cn//show-345-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-29-1.html">sed</category>
			<pubDate>2010-12-15 18:16</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-344-1.html</guid>
			<title>sed 11</title>
			<author>admin</author>
			<description><![CDATA[<p>sed -i '1,/PermitRootLogin/{/PermitRootLogin/c\<br />
PermitRootLogin yes<br />
}' /etc/ssh/sshd_config</p>
<p>只替换一次</p>
<p>&nbsp;</p>
<p>sed -i '/^str/s/^/add/' t.sh</p>
<p>查找以str开头的行,并在行首插入add</p>
<p>&nbsp;</p>
<p>sed -i '/libphp5/s/^/#/' /www/wdlinux/apache/conf/httpd.conf</p>]]></description>
			<link>http://meisw.wdlinux.cn//show-344-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-29-1.html">sed</category>
			<pubDate>2010-12-15 16:40</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-315-1.html</guid>
			<title>sed</title>
			<author>admin</author>
			<description><![CDATA[<div><font size="3"><strong>1.简介</strong></font></div>
<div>&nbsp;</div>
<div>sed是非交互式的编辑器。它不会修改文件，除非使用shell重定向来保存结果。默认情况下，所有的输出行都被打印到屏幕上。</div>
<div>sed编辑器逐行处理文件（或输入），并将结果发送到屏幕。具体过程如下：首先sed把当前正在处理的行保存在一个临时缓存区中（也称为模式空间），然后处理临时缓冲区中的行，完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除，然后将下一行读入，进行处理和显示。处理完输入文件的最后一行后，sed便结束运行。sed把每一行都存在临时缓冲区中，对这个副本进行编辑，所以不会修改原文件。</div>
<div>&nbsp;</div>
<div><font size="3"><strong>2.定址</strong></font></div>
<div>&nbsp;</div>
<div>定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址，sed将处理输入文件的所有行。</div>
<div>&nbsp;</div>
<div>地址是一个数字，则表示行号；是&ldquo;$&quot;符号，则表示最后一行。例如：</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #0000cc">-</span>n <span style="color: #ff00ff">'3p'</span> datafile<br />
            只打印第三行</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>地址是逗号分隔的，那么需要处理的地址是这两行之间的范围（包括这两行在内）。范围可以用数字、正则表达式、或二者的组合表示。例如：</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'2,5d'</span> datafile<br />
            #删除第二到第五行<br />
            sed <span style="color: #ff00ff">'/My/,/You/d'</span> datafile<br />
            #删除包含<span style="color: #ff00ff">&quot;My&quot;<font color="#000000">的</font></span>行到包含<span style="color: #ff00ff">&quot;You&quot;<font color="#000000">的</font></span>行之间的行<br />
            sed <span style="color: #ff00ff">'/My/,10d'</span> datafile<br />
            #删除包含<span style="color: #ff00ff">&quot;My&quot;<font color="#000000">的</font></span>行到第十行的内容</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="3"><strong>3.命令与选项</strong></font></p>
<p>sed命令告诉sed如何处理由地址指定的各输入行，如果没有指定地址则处理所有的输入行。</p>
<p><strong>3.1 sed命令</strong></p>
<p>
<table border="1" cellspacing="1" cellpadding="1" width="500">
    <tbody>
        <tr>
            <td>&nbsp;命令</td>
            <td>&nbsp;功能</td>
        </tr>
        <tr>
            <td>&nbsp;a\</td>
            <td>
            <p>&nbsp;在当前行后添加一行或多行。多行时除最后一行外，每行末尾需用&ldquo;\&rdquo;续行</p>
            </td>
        </tr>
        <tr>
            <td>&nbsp;c\</td>
            <td>&nbsp;用此符号后的新文本替换当前行中的文本。多行时除最后一行外，每行末尾需用&quot;\&quot;续行</td>
        </tr>
        <tr>
            <td>&nbsp;i\</td>
            <td>&nbsp;在当前行之前插入文本。多行时除最后一行外，每行末尾需用&quot;\&quot;续行</td>
        </tr>
        <tr>
            <td>&nbsp;d</td>
            <td>&nbsp;删除行</td>
        </tr>
        <tr>
            <td>&nbsp;h</td>
            <td>&nbsp;把模式空间里的内容复制到暂存缓冲区</td>
        </tr>
        <tr>
            <td>&nbsp;H</td>
            <td>&nbsp;把模式空间里的内容追加到暂存缓冲区</td>
        </tr>
        <tr>
            <td>&nbsp;g</td>
            <td>&nbsp;把暂存缓冲区里的内容复制到模式空间，覆盖原有的内容</td>
        </tr>
        <tr>
            <td>&nbsp;G</td>
            <td>&nbsp;把暂存缓冲区的内容追加到模式空间里，追加在原有内容的后面</td>
        </tr>
        <tr>
            <td>&nbsp;l</td>
            <td>&nbsp;列出非打印字符</td>
        </tr>
        <tr>
            <td>&nbsp;p</td>
            <td>&nbsp;打印行</td>
        </tr>
        <tr>
            <td>&nbsp;n</td>
            <td>&nbsp;读入下一输入行，并从下一条命令而不是第一条命令开始对其的处理</td>
        </tr>
        <tr>
            <td>&nbsp;q</td>
            <td>&nbsp;结束或退出sed</td>
        </tr>
        <tr>
            <td>&nbsp;r</td>
            <td>&nbsp;从文件中读取输入行</td>
        </tr>
        <tr>
            <td>&nbsp;!</td>
            <td>&nbsp;对所选行以外的所有行应用命令</td>
        </tr>
        <tr>
            <td>&nbsp;s</td>
            <td>&nbsp;用一个字符串替换另一个</td>
        </tr>
        <tr>
            <td>&nbsp;g</td>
            <td>&nbsp;在行内进行全局替换</td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>&nbsp;w</td>
            <td>&nbsp;将所选的行写入文件</td>
        </tr>
        <tr>
            <td>&nbsp;x</td>
            <td>&nbsp;交换暂存缓冲区与模式空间的内容</td>
        </tr>
        <tr>
            <td>&nbsp;y</td>
            <td>&nbsp;将字符替换为另一字符（不能对正则表达式使用y命令）</td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>3.2 sed选项</strong></p>
<p>
<table border="1" cellspacing="1" cellpadding="1" width="500">
    <tbody>
        <tr>
            <td>&nbsp;选项</td>
            <td>&nbsp;功能</td>
        </tr>
        <tr>
            <td>&nbsp;-e</td>
            <td>&nbsp;进行多项编辑，即对输入行应用多条sed命令时使用</td>
        </tr>
        <tr>
            <td>&nbsp;-n</td>
            <td>&nbsp;取消默认的输出</td>
        </tr>
        <tr>
            <td>&nbsp;-f</td>
            <td>&nbsp;指定sed脚本的文件名</td>
        </tr>
    </tbody>
</table>
</p>
<div>&nbsp;</div>
<div><font size="3"><strong>4.退出状态</strong></font></div>
<div>&nbsp;</div>
<div>sed不向grep一样，不管是否找到指定的模式，它的退出状态都是0。只有当命令存在语法错误时，sed的退出状态才不是0。</div>
<div>&nbsp;</div>
<div><font size="3"><strong>5.正则表达式元字符</strong></font></div>
<div>&nbsp;</div>
<div>与grep一样，sed也支持特殊元字符，来进行模式查找、替换。不同的是，sed使用的正则表达式是括在斜杠线&quot;/&quot;之间的模式。</div>
<div>如果要把正则表达式分隔符&quot;/&quot;改为另一个字符，比如o，只要在这个字符前加一个反斜线，在字符后跟上正则表达式，再跟上这个字符即可。例如：sed -n '\o^Myop' datafile</div>
<div>&nbsp;</div>
<div>
<table border="1" cellspacing="1" cellpadding="1" width="500">
    <tbody>
        <tr>
            <td>&nbsp;元字符</td>
            <td>&nbsp;功能</td>
            <td>&nbsp;示例</td>
        </tr>
        <tr>
            <td>&nbsp;^</td>
            <td>&nbsp;行首定位符</td>
            <td>&nbsp;/^my/&nbsp; 匹配所有以my开头的行</td>
        </tr>
        <tr>
            <td>&nbsp;$</td>
            <td>&nbsp;行尾定位符</td>
            <td>&nbsp;/my$/&nbsp; 匹配所有以my结尾的行</td>
        </tr>
        <tr>
            <td>&nbsp;.</td>
            <td>&nbsp;匹配除换行符以外的单个字符</td>
            <td>&nbsp;/m..y/&nbsp; 匹配包含字母m，后跟两个任意字符，再跟字母y的行</td>
        </tr>
        <tr>
            <td>&nbsp;*</td>
            <td>&nbsp;匹配零个或多个前导字符</td>
            <td>&nbsp;/my*/&nbsp; 匹配包含字母m,后跟零个或多个y字母的行</td>
        </tr>
        <tr>
            <td>&nbsp;[]</td>
            <td>&nbsp;匹配指定字符组内的任一字符</td>
            <td>&nbsp;/[Mm]y/&nbsp; 匹配包含My或my的行</td>
        </tr>
        <tr>
            <td>&nbsp;[^]</td>
            <td>&nbsp;匹配不在指定字符组内的任一字符</td>
            <td>&nbsp;/[^Mm]y/&nbsp; 匹配包含y，但y之前的那个字符不是M或m的行</td>
        </tr>
        <tr>
            <td>&nbsp;\(..\)</td>
            <td>&nbsp;保存已匹配的字符</td>
            <td>&nbsp;1,20s/\(you\)self/\1r/&nbsp; 标记元字符之间的模式，并将其保存为标签1，之后可以使用\1来引用它。最多可以定义9个标签，从左边开始编号，最左边的是第一个。此例中，对第1到第20行进行处理，you被保存为标签1，如果发现youself，则替换为your。</td>
        </tr>
        <tr>
            <td>&nbsp;&amp;</td>
            <td>&nbsp;保存查找串以便在替换串中引用</td>
            <td>&nbsp;s/my/**&amp;**/&nbsp;&nbsp;符号&amp;代表查找串。my将被替换为**my**</td>
        </tr>
        <tr>
            <td>&nbsp;\&lt;</td>
            <td>&nbsp;词首定位符</td>
            <td>&nbsp;/\&lt;my/&nbsp; 匹配包含以my开头的单词的行</td>
        </tr>
        <tr>
            <td>&nbsp;\&gt;</td>
            <td>&nbsp;词尾定位符</td>
            <td>&nbsp;/my\&gt;/&nbsp; 匹配包含以my结尾的单词的行</td>
        </tr>
        <tr>
            <td>&nbsp;x\{m\}</td>
            <td>&nbsp;连续m个x</td>
            <td>&nbsp;/9\{5\}/ 匹配包含连续5个9的行</td>
        </tr>
        <tr>
            <td>&nbsp;x\{m,\}</td>
            <td>&nbsp;至少m个x</td>
            <td>&nbsp;/9\{5,\}/&nbsp; 匹配包含至少连续5个9的行</td>
        </tr>
        <tr>
            <td>&nbsp;x\{m,n\}</td>
            <td>&nbsp;至少m个，但不超过n个x</td>
            <td>&nbsp;/9\{5,7\}/&nbsp; 匹配包含连续5到7个9的行</td>
        </tr>
    </tbody>
</table>
</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><font size="3"><strong>6.范例</strong></font></div>
<div>&nbsp;</div>
<div><strong>6.1 p命令</strong></div>
<div>&nbsp;</div>
<div>命令p用于显示模式空间的内容。默认情况下，sed把输入行打印在屏幕上，选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。</div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'/my/p'</span> datafile<br />
            #默认情况下，sed把所有输入行都打印在标准输出上。如果某行匹配模式my，p命令将把该行另外打印一遍。</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000"><br />
            sed <span style="color: #0000cc">-</span>n <span style="color: #ff00ff">'/my/p'</span> datafile<br />
            #选项<span style="color: #0000cc">-</span>n取消sed默认的打印，p命令把匹配模式my的行打印一遍。<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.2 d命令</strong></p>
<p>命令d用于删除输入行。sed先将输入行从文件复制到模式空间里，然后对该行执行sed命令，最后将模式空间里的内容显示在屏幕上。如果发出的是命令d，当前模式空间里的输入行会被删除，不被显示。</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'$d'</span> datafile<br />
            #删除最后一行，其余的都被显示<br />
            <br />
            sed <span style="color: #ff00ff">'/my/d'</span> datafile<br />
            #删除包含my的行，其余的都被显示</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.3 s命令</strong></p>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'s/^My/You/g'</span> datafile<br />
            #命令末端的g表示在行内进行全局替换，也就是说如果某行出现多个My，所有的My都被替换为You。<br />
            <br />
            sed <span style="color: #0000cc">-</span>n <span style="color: #ff00ff">'1,20s/My$/You/gp'</span> datafile<br />
            #取消默认输出，处理1到20行里匹配以My结尾的行，把行内所有的My替换为You，并打印到屏幕上。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'s#My#Your#g'</span> datafile<br />
            #紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠，但可以改变。无论什么字符（换行符、反斜线除外），只要紧跟s命令，就成了新的串分隔符。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.4 e选项</strong></p>
<p>-e是编辑命令，用于sed执行多个编辑任务的情况下。在下一行开始编辑前，所有的编辑动作将应用到模式缓冲区中的行上。</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #0000cc">-</span>e <span style="color: #ff00ff">'1,10d'</span> <span style="color: #0000cc">-</span>e <span style="color: #ff00ff">'s/My/Your/g'</span> datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">#选项-e用于进行多重编辑。第一重编辑删除第1-3行。第二重编辑将出现的所有My替换为Your。因为是逐行进行这两项编辑（即这两个命令都在模式空间的当前行上执行），所以编辑命令的顺序会影响结果。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.5 r命令</strong></p>
<p>r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上。</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'/My/r introduce.txt'</span> datafile<br />
            #如果在文件datafile的某一行匹配到模式My，就在该行后读入文件introduce<span style="color: #0000cc">.</span>txt的内容。如果出现My的行不止一行，则在出现My的各行后都读入introduce<span style="color: #0000cc">.</span>txt文件的内容。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
<div><strong>6.6 w命令</strong></div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #0000cc">-</span>n <span style="color: #ff00ff">'/hrwang/w me.txt'</span> datafile<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.7 a\ 命令</strong></p>
<p>a\ 命令是追加命令，追加将添加新文本到文件中当前行（即读入模式缓冲区中的行）的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行，则每一行都必须以反斜线结束，最后一行除外。最后一行将以引号和文件名结束。</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'/^hrwang/a\<br />
            &gt;hrwang and mjfan are husband\<br />
            &gt;and wife'</span> datafile<br />
            #如果在datafile文件中发现匹配以hrwang开头的行，则在该行下面追加hrwang and mjfan are husband and wife</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.8 i\ 命令</strong></p>
<p>i\ 命令是在当前行的前面插入新的文本。</p>
<p><strong>6.9 c\ 命令</strong></p>
<p>sed使用该命令将已有文本修改成新的文本。</p>
<p><strong>6.10 n命令</strong></p>
<p>sed使用该命令获取输入文件的下一行，并将其读入到模式缓冲区中，任何sed命令都将应用到匹配行紧接着的下一行上。</p>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'/hrwang/{n;s/My/Your/;}'</span> datafile<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
<div><font color="#339999">注：如果需要使用多条命令，或者需要在某个地址范围内嵌套地址，就必须用花括号将命令括起来，每行只写一条命令，或这用分号分割同一行中的多条命令。</font></div>
<div>&nbsp;</div>
<div><strong>6.11 y命令</strong></div>
<div>&nbsp;</div>
<div>该命令与UNIX/Linux中的tr命令类似，字符按照一对一的方式从左到右进行转换。例如，y/abc/ABC/将把所有小写的a转换成A，小写的b转换成B，小写的c转换成C。</div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'1,20y/hrwang12/HRWANG^$/'</span> datafile<br />
            #将1到20行内，所有的小写hrwang转换成大写，将1转换成^<span style="color: #0000cc">,</span>将2转换成<span style="color: #0000ff">$</span><span style="color: #008080">。</span><br />
            #正则表达式元字符对y命令不起作用。与s命令的分隔符一样，斜线可以被替换成其它的字符。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.12 q命令</strong></p>
<p>q命令将导致sed程序退出，不再进行其它的处理。</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #ff00ff">'/hrwang/{s/hrwang/HRWANG/;q;}'</span> datafile<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>6.13 h命令和g命令</strong></p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">#cat datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">My name is hrwang.</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">Your name is mjfan.</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">hrwang is mjfan's husband.</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">mjfan is hrwang's wife.</span></code></p>
            <p style="line-height: 150%; margin: 5px">&nbsp;</p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed <span style="color: #0000cc">-</span>e <span style="color: #ff00ff">'/hrwang/h'</span> <span style="color: #0000cc">-</span>e <span style="color: #ff00ff">'$G'</span> datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed -e '/hrwang/H' -e '$G' datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">#通过上面两条命令，你会发现h会把原来暂存缓冲区的内容清除，只保存最近一次执行h时保存进去的模式空间的内容。而H命令则把每次匹配hrwnag的行都追加保存在暂存缓冲区。<br />
            </span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed -e '/hrwang/H' -e '$g' datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">sed -e '/hrwang/H' -e '$G' datafile</span></code></p>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">#通过上面两条命令，你会发现g把暂存缓冲区中的内容替换掉了模式空间中当前行的内容，此处即替换了最后一行。而G命令则把暂存缓冲区的内容追加到了模式空间的当前行后。此处即追加到了末尾。</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="3"><strong>7. sed脚本</strong></font></p>
<p>sed脚本就是写在文件中的一列sed命令。脚本中，要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令，要用分号分隔。执行脚本时，sed先将输入文件中第一行复制到模式缓冲区，然后对其执行脚本中所有的命令。每一行处理完毕后，sed再复制文件中下一行到模式缓冲区，对其执行脚本中所有命令。使用sed脚本时，不再用引号来确保sed命令不被shell解释。例如sed脚本script：</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000"><span style="color: #ff9900">#handle datafile</span><br />
            3i\<br />
            <span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><br />
            3<span style="color: #0000cc">,</span><span style="color: #0000ff">$</span><span style="color: #008080">s</span><span style="color: #0000cc">/</span><span style="color: #0000cc">\</span><span style="color: #0000cc">(</span>hrwang\<span style="color: #0000cc">)</span> is</span></code><code><span style="color: #000000">&nbsp;\<span style="color: #0000cc">(</span>mjfan\<span style="color: #0000cc">)</span><span style="color: #0000cc">/</span><span style="color: #0000cc">\</span>2 is \1<span style="color: #0000cc">/</span></span></code><code><span style="color: #000000"><br />
            <span style="color: #0000ff">$</span><span style="color: #008080">a</span><span style="color: #008080">\</span><br />
            We will love eachother <span style="color: #0000ff">for</span>ever！！</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000"><span style="color: #ff9900">#sed -f script datafile</span><br />
            <font color="#000000"><span style="color: #0000ff">My</span> </font>name is hrwang<br />
            Your name is mjfan<br />
            <span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><span style="color: #0000cc">~</span><br />
            mjfan is hrwang<span style="color: #ff00ff"><font color="#000000">'s </font><font color="#000000">husband</font>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＃啦啦～～～<br />
            <font color="#000000">mjfan is hrwang'</font></span><font color="#000000">s wife<span style="color: #0000cc">.</span><br />
            </font>We will love eachother forever！！</span></code></p>
            </td>
        </tr>
    </tbody>
</table>]]></description>
			<link>http://meisw.wdlinux.cn//show-315-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-29-1.html">sed</category>
			<pubDate>2010-12-05 19:53</pubDate>
		</item>
	</channel>
</rss>
