Loading... <p> sed编辑器被称作流编辑器(stream editor)。流编辑器在处理数据之前基于预先提供的一组规则来编辑数据流。</p> <p><strong><span style="font-size: 18px">一、命令格式</span></strong></p> <p> sed options '"地址""编辑命令"' file</p> <p> 常用选项:</p> <p> -n:静默模式,不显示模式内容空间中的内容;</p> <p> -r:支持使用扩展正则表达式;</p> <p> -i:修改原文件;</p> <p> -e:执行多个命令;</p> <p> -f file:将file中指定的命令添加到运行的命令中;</p> <p> 常用编辑命令: </p> <p> p:打印;</p> <p> s:文本替换;</p> <p> d:删除;</p> <p> i text:行上方插入,text即为插入的内容;</p> <p> a test:行下方插入,使用\n插入多行内容;</p> <p> c:修改行内容;</p> <p> r path/from/file:在指定位置合并两个文件;</p> <p> w path/to/somefile:把符合条件的行保存至指定的文件中;</p> <p><strong><span style="font-size: 18px">二、应用实例</span></strong></p> <p> <strong> 1、替换文本</strong></p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-61.jpg" title="1451284210993994.jpg" alt="1.jpg" /></p> <p> 上例中将/etc/issue文件中的字符“e”替换为数据“8”,但其结果只替换了每行的第一个匹配字符,可以使用替换标记来完成替换所有匹配字符的工作。</p> <p> 1.1 替换标记</p> <p> 格式:s/pattern/replacement/flags</p> <p> 替换标记(flags):</p> <p> 数字:表明新文本将替换第几处模式匹配的地方;</p> <p> g:表明新文体将替换所有模式匹配的地方;</p> <p> p:原来行的内容要打印出来;</p> <p> w file:将替换结果写到文件中。</p> <p> 替换第二个匹配的内容:</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-93.jpg" title="1451284551761362.jpg" alt="5.jpg" /></p> <p> 替换所有匹配的内容:</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-9.jpg" title="1451284604964827.jpg" alt="2.jpg" /></p> <p> 只显示被替换过内容的行,通常与-n选项一起使用:</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-81.jpg" title="1451284649977684.jpg" alt="3.jpg" /></p> <p> 将替换的内容输出到文件中:</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-38.jpg" title="1451284707687724.jpg" alt="4.jpg" /></p> <p> 1.2 字符串分隔符</p> <p> 在使用进行替换操作时,通常我们习惯使用"/"符号作为分隔符,如查"/"符号需要在模式中用到的话则需在使用"\"来进行转义,如下所示:</p> <p> sed 's/\/tmp/\/dev' /tmp/test</p> <p> 上面的表达式看起来不容易阅读,可以通过修改字符串分隔符来解决此问题:</p> <p> sed 's%/tmp%/dev' /tmp/test</p> <p> 上面的表达式使用"%"来作为字符串分隔符,依然可以达到替换效果。</p> <p> 注:字符串分隔符可以使用任意字符来替换。</p> <p> <strong>2、地址</strong></p> <p> sed编辑器中可以使用指定地址的方式来过滤想要进行操作的作。</p> <p> 两种行寻址的形式:</p> <p> 1、行的数字范围</p> <p> 2、文本模式过滤</p> <p> 格式:[address]command</p> <p> 2.1 数字方式</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-80.jpg" title="1451285772670050.jpg" alt="6.jpg" /></p> <p> 上例中只是在s命令前添加地址3,作用是将第3行的“:”全部替换为“,”。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180648-8.jpg" title="1451285905340234.jpg" alt="7.jpg" /></p> <p> 上例中指定了一个地址范围3到5行。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-32.jpg" title="1451286032734289.jpg" alt="8.jpg" /></p> <p> 上例中使用了"$"符号,表示将第3行至最后一行的所有“:”全部替换成为“,”。</p> <p> 2.2 文本模式</p> <p> 格式:/pattern/command</p> <p> 模式必须使用"/"括起来。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-67.jpg" title="1451286312593314.jpg" alt="9.jpg" /></p> <p> 上例中只替换了有Kernel存在的行。</p> <p> 2.3 多命令</p> <p> sed编辑器还支持多个命令同时执行。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-34.jpg" title="1451286888277896.jpg" alt="10.jpg" /></p> <p> 上例中对于有Kernel的行同时进行了两个地方的替换。</p> <p> <strong>3、删除</strong></p> <p> 删除命令d会将文本中的内容真的删除掉,只是在sed编辑器输出时会被删除掉。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-43.jpg" title="1451287224680574.jpg" alt="11.jpg" /></p> <p> <strong>4、插入和追加文本</strong></p> <p> 插入命令i会在指定行的行前增加一个新行;</p> <p> 追加命令a会在指定行的行后增加一个新行。</p> <p> 格式:[地址]a/i 插入的内容</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-64.jpg" title="1451287609561767.jpg" alt="12.jpg" /></p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-58.jpg" title="1451287624503773.jpg" alt="13.jpg" /></p> <p> <strong>5、修改行</strong></p> <p> 工作机制与插入和追加相同,格式也一样。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-43-1.jpg" title="1451287772923059.jpg" alt="14.jpg" /></p> <p> 将/etc/issue文件的第一行修改为指定内容。</p> <p> <strong> 6、将替换结果写到文件</strong></p> <p> 格式:[address]w filename</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-92.jpg" title="1451288103966692.jpg" alt="15.jpg" /></p> <p> <strong> 7、从文件中读取数据</strong></p> <p> 格式:[address]r filename</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-93.jpg" title="1451288241771874.jpg" alt="16.jpg" /></p> <p> 将test文件中的内容插入到/etc/issue文件中。</p> <p> <strong>8、常用选项实例</strong></p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-31.jpg" title="1451288775410298.jpg" alt="17.jpg" /></p> <p> 使用-e选项同时执行多个命令。</p> <p style="text-align:center"><img src="//cto.wang/usr/uploads/2016/07/20160703180649-28.jpg" title="1451288781228929.jpg" alt="18.jpg" /></p> <p> 使用文件中的命令来执行替换操作。</p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信