<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>花开的地方 &#187; sed</title>
	<atom:link href="http://www.bsdmap.com/tag/sed/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bsdmap.com</link>
	<description>花开，没有声音……</description>
	<lastBuildDate>Sat, 04 Feb 2012 21:18:36 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19814</generator>
		<item>
		<title>大小写转换</title>
		<link>http://www.bsdmap.com/2010/02/07/tr/</link>
		<comments>http://www.bsdmap.com/2010/02/07/tr/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 05:17:29 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[bash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[tr]]></category>
		<category><![CDATA[大小写转换]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/?p=1831</guid>
		<description><![CDATA[将文件file.txt的小写字母转换成大写 1. 使用tr cat file.txt &#124; tr a-z A-Z 2. 使用sed sed &#8216;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/&#8217; file.txt sed的 y/source/dest/   Transliterate  the  characters  in  the  pattern space which appear in source to the corresponding character in dest.]]></description>
			<content:encoded><![CDATA[<p>将文件file.txt的小写字母转换成大写</p>
<p>1. 使用tr<br />
cat file.txt | tr a-z A-Z<br />
2. 使用sed<br />
sed &#8216;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/&#8217; file.txt</p>
<p>sed的 y/source/dest/   Transliterate  the  characters  in  the  pattern space which appear in source to the corresponding character in dest.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2010/02/07/tr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于sed的小发现</title>
		<link>http://www.bsdmap.com/2008/04/02/%e5%85%b3%e4%ba%8esed%e7%9a%84%e5%b0%8f%e5%8f%91%e7%8e%b0/</link>
		<comments>http://www.bsdmap.com/2008/04/02/%e5%85%b3%e4%ba%8esed%e7%9a%84%e5%b0%8f%e5%8f%91%e7%8e%b0/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 03:47:20 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/~nnix/2008/04/02/%e5%85%b3%e4%ba%8esed%e7%9a%84%e5%b0%8f%e5%8f%91%e7%8e%b0/</guid>
		<description><![CDATA[今天使用sed编辑5G大的文件，发现居然是有中间文件生成的，这以后可得注意了，因为有可能会因为磁盘空间不够而操作失败啊！]]></description>
			<content:encoded><![CDATA[<p>今天使用sed编辑5G大的文件，发现居然是有中间文件生成的，这以后可得注意了，因为有可能会因为磁盘空间不够而操作失败啊！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2008/04/02/%e5%85%b3%e4%ba%8esed%e7%9a%84%e5%b0%8f%e5%8f%91%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用sed编辑文件</title>
		<link>http://www.bsdmap.com/2008/01/19/%e4%bd%bf%e7%94%a8sed%e7%bc%96%e8%be%91%e6%96%87%e4%bb%b6/</link>
		<comments>http://www.bsdmap.com/2008/01/19/%e4%bd%bf%e7%94%a8sed%e7%bc%96%e8%be%91%e6%96%87%e4%bb%b6/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 16:46:11 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/~nnix/2008/01/19/%e4%bd%bf%e7%94%a8sed%e7%bc%96%e8%be%91%e6%96%87%e4%bb%b6/</guid>
		<description><![CDATA[1. Sed简介 sed 是一种在线编辑器，它一次处理一行内容。处理时，把当前处理的行存储在临时缓冲区中，称为“模式空间”（pattern space），接着用sed命令处理缓冲区中的内容，处理完成后，把缓冲区的内容送往屏幕。接着处理下一行，这样不断重复，直到文件末尾。文件内容并没有 改变，除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件；简化对文件的反复操作；编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。 2. 定址 可以通过定址来定位你所希望编辑的行，该地址用数字构成，用逗号分隔的两个行数表示以这两行为起止的行的范围（包括行数表示的那两行）。如1，3表示1，2，3行，美元符号($)表示最后一行。范围可以通过数据，正则表达式或者二者结合的方式确定 。 3. Sed命令 调用sed命令有两种形式： sed [options] &#8216;command&#8217;file(s) sed [options] -f scriptfile file(s) a\ 在当前行后面加入一行文本。 b lable 分支到脚本中带有标记的地方，如果分支不存在则分支到脚本的末尾。 c\ 用新的文本改变本行的文本。 d 从模板块（Pattern space）位置删除行。 D 删除模板块的第一行。 i\ 在当前行上面插入文本。 h 拷贝模板块的内容到内存中的缓冲区。 H 追加模板块的内容到内存中的缓冲区 g 获得内存缓冲区的内容，并替代当前模板块中的文本。 G 获得内存缓冲区的内容，并追加到当前模板块文本的后面。 l 列表不能打印字符的清单。 n 读取下一个输入行，用下一个命令处理新的行而不是用第一个命令。 N 追加下一个输入行到模板块后面并在二者间嵌入一个新行，改变当前行号码。 p 打印模板块的行。 P（大写） 打印模板块的第一行。 q 退出Sed。 r file [...]]]></description>
			<content:encoded><![CDATA[<h2 class="title" style="clear: both">1. Sed简介</h2>
<p>sed 是一种在线编辑器，它一次处理一行内容。处理时，把当前处理的行存储在临时缓冲区中，称为“模式空间”（pattern space），接着用sed命令处理缓冲区中的内容，处理完成后，把缓冲区的内容送往屏幕。接着处理下一行，这样不断重复，直到文件末尾。文件内容并没有 改变，除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件；简化对文件的反复操作；编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。</p>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2875182"></a>2. 定址</h2>
<p>可以通过定址来定位你所希望编辑的行，该地址用数字构成，用逗号分隔的两个行数表示以这两行为起止的行的范围（包括行数表示的那两行）。如1，3表示1，2，3行，美元符号($)表示最后一行。范围可以通过数据，正则表达式或者二者结合的方式确定 			。</p>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2811706"></a>3. Sed命令</h2>
<p>调用sed命令有两种形式：</p>
<p class="itemizedlist">
<ul type="disc">
<li>sed [options] &#8216;command&#8217;file(s)</li>
<li>sed [options] -f scriptfile file(s)</li>
</ul>
<p class="variablelist">
<dl>
<dt><span class="term">a\</span></dt>
<dd>在当前行后面加入一行文本。</p>
</dd>
<dt><span class="term">b lable</span></dt>
<dd>分支到脚本中带有标记的地方，如果分支不存在则分支到脚本的末尾。</p>
</dd>
<dt><span class="term">c\</span></dt>
<dd>用新的文本改变本行的文本。</p>
</dd>
<dt><span class="term">d</span></dt>
<dd>从模板块（Pattern space）位置删除行。</p>
</dd>
<dt><span class="term">D</span></dt>
<dd>删除模板块的第一行。</p>
</dd>
<dt><span class="term">i\</span></dt>
<dd>在当前行上面插入文本。</p>
</dd>
<dt><span class="term">h</span></dt>
<dd>拷贝模板块的内容到内存中的缓冲区。</p>
</dd>
<dt><span class="term">H</span></dt>
<dd>追加模板块的内容到内存中的缓冲区</p>
</dd>
<dt><span class="term">g</span></dt>
<dd>获得内存缓冲区的内容，并替代当前模板块中的文本。</p>
</dd>
<dt><span class="term">G</span></dt>
<dd>获得内存缓冲区的内容，并追加到当前模板块文本的后面。</p>
</dd>
<dt><span class="term">l</span></dt>
<dd>列表不能打印字符的清单。</p>
</dd>
<dt><span class="term">n</span></dt>
<dd>读取下一个输入行，用下一个命令处理新的行而不是用第一个命令。</p>
</dd>
<dt><span class="term">N</span></dt>
<dd>追加下一个输入行到模板块后面并在二者间嵌入一个新行，改变当前行号码。</p>
</dd>
<dt><span class="term">p</span></dt>
<dd>打印模板块的行。</p>
</dd>
<dt><span class="term">P（大写）</span></dt>
<dd>打印模板块的第一行。</p>
</dd>
<dt><span class="term">q</span></dt>
<dd>退出Sed。</p>
</dd>
<dt><span class="term">r file</span></dt>
<dd>从file中读行。</p>
</dd>
<dt><span class="term">t label</span></dt>
<dd>if分支，从最后一行开始，条件一旦满足或者T，t命令，将导致分支到带有标号的命令处，或者到脚本的末尾。</p>
</dd>
<dt><span class="term">T label</span></dt>
<dd>错误分支，从最后一行开始，一旦发生错误或者T，t命令，将导致分支到带有标号的命令处，或者到脚本的末尾。</p>
</dd>
<dt><span class="term">w file</span></dt>
<dd>写并追加模板块到file末尾。</p>
</dd>
<dt><span class="term">W file</span></dt>
<dd>写并追加模板块的第一行到file末尾。</p>
</dd>
<dt><span class="term">!</span></dt>
<dd>表示后面的命令对所有没有被选定的行发生作用。</p>
</dd>
<dt><span class="term">s/re/string</span></dt>
<dd>用string替换正则表达式re。</p>
</dd>
<dt><span class="term">=</span></dt>
<dd>打印当前行号码。</p>
</dd>
<dt><span class="term">#</span></dt>
<dd>把注释扩展到下一个换行符以前。</p>
</dd>
<dt><span class="term">以下的是替换标记</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>g表示行内全面替换。</li>
<li>p表示打印行。</li>
<li>w表示把行写入一个文件。</li>
<li>x表示互换模板块中的文本和缓冲区中的文本。</li>
<li>y表示把一个字符翻译为另外的字符（但是不用于正则表达式）</li>
</ul>
</dd>
</dl>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2810348"></a>4. 选项</h2>
<p class="variablelist">
<dl>
<dt><span class="term">-e command, </span><span class="term">&#8211;expression=command</span></dt>
<dd>允许多台编辑。</p>
</dd>
<dt><span class="term">-h, &#8211;help</span></dt>
<dd>打印帮助，并显示bug列表的地址。</p>
</dd>
<dt><span class="term">-n, &#8211;quiet, &#8211;silent</span></dt>
<dd>取消默认输出。</p>
</dd>
<dt><span class="term">-f, &#8211;filer=script-file</span></dt>
<dd>引导sed脚本文件名。</p>
</dd>
<dt><span class="term">-V, &#8211;version</span></dt>
<dd>打印版本和版权信息。</p>
</dd>
</dl>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2810450"></a>5. 元字符集</h2>
<p class="variablelist">
<dl>
<dt><span class="term">^</span></dt>
<dd>锚定行的开始  如：/^sed/匹配所有以sed开头的行。</p>
</dd>
<dt><span class="term">$</span></dt>
<dd>锚定行的结束 如：/sed$/匹配所有以sed结尾的行。</p>
</dd>
<dt><span class="term">.</span></dt>
<dd>匹配一个非换行符的字符 如：/s.d/匹配s后接一个任意字符，然后是d。</p>
</dd>
<dt><span class="term">*</span></dt>
<dd>匹配零或多个字符 如：/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。</p>
</dd>
<dt><span class="term">[]</span></dt>
<dd>匹配一个指定范围内的字符，如/[Ss]ed/匹配sed和Sed。</p>
</dd>
<dt><span class="term">[^]</span></dt>
<dd>匹配一个不在指定范围内的字符，如：/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头，紧跟ed的行。</p>
</dd>
<dt><span class="term">\(..\)</span></dt>
<dd>保存匹配的字符，如s/\(love\)able/\1rs，loveable被替换成lovers。</p>
</dd>
<dt><span class="term">&amp;</span></dt>
<dd>保存搜索字符用来替换其他字符，如s/love/**&amp;**/，love这成**love**。</p>
</dd>
<dt><span class="term">\&lt;</span></dt>
<dd>锚定单词的开始，如:/\&lt;love/匹配包含以love开头的单词的行。</p>
</dd>
<dt><span class="term">\&gt;</span></dt>
<dd>锚定单词的结束，如/love\&gt;/匹配包含以love结尾的单词的行。</p>
</dd>
<dt><span class="term">x\{m\}</span></dt>
<dd>重复字符x，m次，如：/0\{5\}/匹配包含5个o的行。</p>
</dd>
<dt><span class="term">x\{m,\}</span></dt>
<dd>重复字符x,至少m次，如：/o\{5,\}/匹配至少有5个o的行。</p>
</dd>
<dt><span class="term">x\{m,n\}</span></dt>
<dd>重复字符x，至少m次，不多于n次，如：/o\{5,10\}/匹配5&#8211;10个o的行。</p>
</dd>
</dl>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2861508"></a>6. 实例</h2>
<p class="variablelist">
<dl>
<dt><span class="term">删除：d命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8217;2d&#8217;example&#8212;&#8211;删除example文件的第二行。</li>
<li>$ sed &#8217;2,$d&#8217;example&#8212;&#8211;删除example文件的第二行到末尾所有行。</li>
<li>$ sed &#8216;$d&#8217;example&#8212;&#8211;删除example文件的最后一行。</li>
<li>$ sed &#8216;/test/&#8217;d example&#8212;&#8211;删除example文件所有包含test的行。</li>
</ul>
</dd>
<dt><span class="term">替换：s命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8216;s/test/mytest/g&#8217;example&#8212;&#8211;在整行范围内把test替换为mytest。如果没有g标记，则只有每行第一个匹配的test被替换成mytest。</li>
<li>$ sed -n &#8216;s/^test/mytest/p&#8217;example&#8212;&#8211;(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说，如果某一行开头的test被替换成mytest，就打印它。</li>
<li>$ sed &#8216;s/^192.168.0.1/&amp;localhost/&#8217;example&#8212;&#8211;&amp;符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost，变成192.168.0.1localhost。</li>
<li>$ sed -n &#8216;s/\(love\)able/\1rs/p&#8217;example&#8212;&#8211;love被标记为1，所有loveable会被替换成lovers，而且替换的行会被打印出来。</li>
<li>$ sed &#8216;s#10#100#g&#8217;example&#8212;&#8211;不论什么字符，紧跟着s命令的都被认为是新的分隔符，所以，“#”在这里是分隔符，代替了默认的“/”分隔符。表示把所有10替换成100。</li>
</ul>
</dd>
<dt><span class="term">选定行的范围：逗号</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed -n &#8216;/test/,/check/p&#8217;example&#8212;&#8211;所有在模板test和check所确定的范围内的行都被打印。</li>
<li>$ sed -n &#8217;5,/^test/p&#8217;example&#8212;&#8211;打印从第五行开始到第一个包含以test开始的行之间的所有行。</li>
<li>$ sed &#8216;/test/,/check/s/$/sed test/&#8217;example&#8212;&#8211;对于模板test和west之间的行，每行的末尾用字符串sed test替换。</li>
</ul>
</dd>
<dt><span class="term">多点编辑：e命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed -e &#8217;1,5d&#8217;-e &#8216;s/test/check/&#8217;example&#8212;&#8211;(-e)选项允许在同一行里执行多条命令。如例子所示，第一条命令删除1至5行，第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令，那么第一个替换命令将影响第二个替换命令的结果。</li>
<li>$ sed &#8211;expression=&#8217;s/test/check/&#8217;&#8211;expression=&#8217;/love/d&#8217;example&#8212;&#8211;一个比-e更好的命令是&#8211;expression。它能给sed表达式赋值。</li>
</ul>
</dd>
<dt><span class="term">从文件读入：r命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8216;/test/r file&#8217;example&#8212;&#8211;file里的内容被读进来，显示在与test匹配的行后面，如果匹配多行，则file的内容将显示在所有匹配行的下面。</li>
</ul>
</dd>
<dt><span class="term">写入文件：w命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed -n &#8216;/test/w file&#8217;example&#8212;&#8211;在example中所有包含test的行都被写入file里。</li>
</ul>
</dd>
<dt><span class="term">追加命令：a命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8216;/^test/a\\&#8212;&gt;this is a example&#8217;example&lt;&#8212;&#8211;&#8217;this is a example&#8217;被追加到以test开头的行后面，sed要求命令a后面有一个反斜杠。</li>
</ul>
</dd>
<dt><span class="term">插入：i命令</span></dt>
<dd>$ sed &#8216;/test/i\\</p>
<p>new line</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&#8217;example</p>
<p>如果test被匹配，则把反斜杠后面的文本插入到匹配行的前面。</p>
</dd>
<dt><span class="term">下一个：n命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8216;/test/{ n; s/aa/bb/; }&#8217;example&#8212;&#8211;如果test被匹配，则移动到匹配行的下一行，替换这一行的aa，变为bb，并打印该行，然后继续。</li>
</ul>
</dd>
<dt><span class="term">变形：y命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8217;1,10y/abcde/ABCDE/&#8217;example&#8212;&#8211;把1&#8211;10行内所有abcde转变为大写，注意，正则表达式元字符不能使用这个命令。</li>
</ul>
</dd>
<dt><span class="term">退出：q命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed &#8217;10q&#8217;example&#8212;&#8211;打印完第10行后，退出sed。</li>
</ul>
</dd>
<dt><span class="term">保持和获取：h命令和G命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed -e &#8216;/test/h&#8217;-e &#8216;$G example&#8212;&#8211;在sed处理文件的时候，每一行都被保存在一个叫模式空间的临时缓冲区中，除非行被删除或者输出被取消，否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空，并存入新的一行等待处理。在这个例子里，匹配test的行被找到后，将存入模式空间，h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是，当到达最后一行后，G命令取出保持缓冲区的行，然后把它放回模式空间中，且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说，任何包含test的行都被复制并追加到该文件的末尾。</li>
</ul>
</dd>
<dt><span class="term">保持和互换：h命令和x命令</span></dt>
<dd>
<p class="itemizedlist">
<ul type="disc">
<li>$ sed -e &#8216;/test/h&#8217;-e &#8216;/check/x&#8217;example &#8212;&#8211;互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。</li>
</ul>
</dd>
</dl>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2808415"></a>7. 脚本</h2>
<p>Sed脚本是一个sed的命令清单，启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔，在命令的末尾不能有任何空白或文本，如果在一行中有多个命令，要用分号分隔。以#开头的行为注释行，且不能跨行。</p>
<p class="sect1" lang="en">
<p class="titlepage">
<h2 class="title" style="clear: both"><a name="id2808439"></a>8. 小技巧</h2>
<p class="itemizedlist">
<ul type="disc">
<li>在sed的命令行中引用shell变量时要使用双引号，而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本：
<pre class="screen">name='zone\ "localhost"'
sed "/$name/,/};/d" named.conf</pre>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2008/01/19/%e4%bd%bf%e7%94%a8sed%e7%bc%96%e8%be%91%e6%96%87%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

