知识大全 SED单行脚本快速参考(流编辑器)第1/2页
Posted 文件
篇首语:一万年来谁著史,三千里外欲封侯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SED单行脚本快速参考(流编辑器)第1/2页相关的知识,希望对你有一定的参考价值。
SED单行脚本快速参考(流编辑器)第1/2页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
sed (stream editor)功能说明 利用script来处理文本文件 语法 sed [ hnV][ e<script>][ f<script文件>][文本文件]补充说明 sed可依照script的指令 来处理 编辑文本文件 参数 e<script>或 expression=<script> 以选项中指定的script来处理输入的文本文件 f<script文件>或 file=<script文件> 以选项中指定的script文件来处理输入的文本文件 h或 help 显示帮助 n或 quiet或 silent 仅显示script处理后的结果
V或 version 显示版本信息
sed工作原理sed是一个非交互式的流编辑器 所谓非交互式 是指使用sed只能在命令行下输入编辑命令来编辑文本 然后在屏幕上查看输出 而所谓流编辑器 是指sed每次只从文件(或输入)读入一行 然后对该行进行指定的处理 并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令) 接着读入下一行 整个文件像流水一样被逐行处理然后逐行输出
下面我们看一下sed的工作过程
sed不是在原输入上直接进行处理的 而是先将读入的行放到缓冲区中 对缓冲区里的内容进行处理 处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果) 而是直接输出到屏幕上 sed运行过程中维护着两个缓冲区 一个是活动的 模式空间(pattern space) 另一个是起辅助作用的 暂存缓冲区(holding space) 一般情况下 每当运行sed sed首先把第一行装入模式空间 进行处理后输出到屏幕 然后将第二行装入模式空间替换掉模式空间里原来的内容 然后进行处理 以此类推
一般情况下暂存缓冲区是用不到的 但有特殊的命令可以在模式空间与暂存缓冲区之间交换数据 后文将有介绍 由于sed对文本的所有操作都是在缓冲区里进行的 所以不会对原文件造成任何破坏
sed命令格式
sed的命令格式如下 sed [ Options] [ Commands ] filename其中 Command是一个sed命令 sed命令一定要被包含在一对单引号中 以免被shell解释 其格式如下 [address range][sed mand]或[Pattern to match][sed mand]address range是指要处理的行的范围 又叫地址范围 pattern to match是一个要匹配的模式 是一个正则表达式 sed mand是一个sed命令 用来对指定的行进行处理 下面是一个简单的例子 sed –n p students这个命令将文件students中的第 到 行打印到屏幕 注意 地址范围和sed命令之间没有空格 如果加入空格 sed也会将其忽略 参数 n用来取消默认输出 默认情况下 sed每读入一行到模式空间 无论是否对其进行处理 在读入下一行之前多要将模式空间中的内容输出到屏幕上 参数 n可以用来取消这种默认的输出 只有当用户用命令p时才将指定的行输出到屏幕 如果没有用参数 n而又对指定行执行了p命令 那么这些行将会被打印两次 地址范围可以是一个数字 这个数字代表了一个行号 也可以是一个用逗号分隔的两个数字表示的范围(包括这两行) 范围可以是数字 正则表达式 或是两者的组合 pattern to match是一个要匹配的模式 sed将会对所有匹配的行执行sed mand 其实 这里的pattern to match也可以看作是一个地址 这个地址是所有与指定模式匹配的行的行号 因此sed的格式可以归纳为一种 sed [ Options] [address range][sed mand] filename
文本间隔
# 在每一行后面增加一空行sed G# 将原来的所有空行删除并在每一行后面增加一空行 # 这样在输出的文本中每一行后面将有且只有一空行 sed /^$/d;G # 在每一行后面增加两行空行sed G;G # 将第一个脚本所产生的所有空行删除(即删除所有偶[奇]数行)sed n;d # 在匹配式样 regex 的行之前插入一空行sed /regex/x;p;x;
# 在匹配式样 regex 的行之后插入一空行sed /regex/G # 在匹配式样 regex 的行之前和之后各插入一空行sed /regex/x;p;x;G;
编号
# 为文件中的每一行进行编号(简单的左对齐方式) 这里使用了 制表符 # (tab 见本文末尾关于 \\t 的用法的描述)而不是空格来对齐边缘 sed = filename | sed N;s/\\n/\\t/ # 对文件中的所有行编号(行号在左[上] 文字右[左]端对齐) sed = filename | sed N; s/^/ /; s/ *\\( \\ \\\\)\\n/\\ / # 对文件中的所有行编号 但只显示非空白行的行号 sed / /= filename | sed / /N; s/\\n/ / # 计算行数(模拟 wc l )sed n $=
文本转换和替代
# Unix环境 转换DOS的新行符(CR/LF)为Unix格式 sed s/ $// # 假设所有行以CR/LF结束sed s/^M$// # 在bash/tcsh中 将按Ctrl M改为按Ctrl Vsed s/\\x D$// # ssed gsed 及更高版本# Unix环境 转换Unix的新行符(LF)为DOS格式 sed s/$/`echo e \\\\\\r`/ # 在ksh下所使用的命令sed s/$ /`echo \\\\\\r`/ # 在bash下所使用的命令sed s/$/`echo \\\\\\r`/ # 在zsh下所使用的命令sed s/$/\\r/ # gsed 及更高版本
# DOS环境 转换Unix新行符(LF)为DOS格式 sed s/$// # 方法 sed n p # 方法 # DOS环境 转换DOS新行符(CR/LF)为Unix格式 # 下面的脚本只对UnxUtils sed 及更高版本有效 要识别UnxUtils版本的# sed可以通过其特有的 text 选项 你可以使用帮助选项( help )看# 其中有无一个 text 项以此来判断所使用的是否是UnxUtils版本 其它DOS# 版本的的sed则无法进行这一转换 但可以用 tr 来实现这一转换 sed s/\\r// infile >outfile # UnxUtils sed v 或更高版本tr d \\r <infile >outfile # GNU tr 或更高版本# 将每一行前导的 空白字符 (空格 制表符)删除# 使之左对齐sed s/^[ \\t]*// # 见本文末尾关于 \\t 用法的描述# 将每一行拖尾的 空白字符 (空格 制表符)删除sed s/[ \\t]*$// # 见本文末尾关于 \\t 用法的描述
# 将每一行中的前导和拖尾的空白字符删除sed s/^[ \\t]*//;s/[ \\t]*$// # 在每一行开头处插入 个空格(使全文向右移动 个字符的位置)sed s/^/ / # 以 个字符为宽度 将所有文本右对齐sed e :a e s/^ \\ \\$/ &/;ta # 个字符外加最后的一个空格# 以 个字符为宽度 使所有文本居中 在方法 中 为了让文本居中每一行的前# 头和后头都填充了空格 在方法 中 在居中文本的过程中只在文本的前面填充# 空格 并且最终这些空格将有一半会被删除 此外每一行的后头并未填充空格
sed e :a e s/^ \\ \\$/ & /;ta # 方法 sed e :a e s/^ \\ \\$/ &/;ta e s/\\( *\\)\\ /\\ / # 方法 # 在每一行中查找字串 foo 并将找到的 foo 替换为 bar sed s/foo/bar/ # 只替换每一行中的第一个 foo 字串sed s/foo/bar/ # 只替换每一行中的第四个 foo 字串sed s/foo/bar/g # 将每一行中的所有 foo 都换成 bar sed s/\\( *\\)foo\\( *foo\\)/\\ bar\\ / # 替换倒数第二个 foo sed s/\\( *\\)foo/\\ bar/ # 替换最后一个 foo # 只在行中出现字串 baz 的情况下将 foo 替换成 bar sed /baz/s/foo/bar/g # 将 foo 替换成 bar 并且只在行中未出现字串 baz 的情况下替换sed /baz/!s/foo/bar/g
# 不管是 scarlet ruby 还是 puce 一律换成 red sed s/scarlet/red/g;s/ruby/red/g;s/puce/red/g #对多数的sed都有效gsed s/scarlet\\|ruby\\|puce/red/g # 只对GNU sed有效# 倒置所有行 第一行成为最后一行 依次类推(模拟 tac ) # 由于某些原因 使用下面命令时HHsed v 会将文件中的空行删除sed !G;h;$!d # 方法 sed n !G;h;$p # 方法 # 将行中的字符逆序排列 第一个字成为最后一字 ……(模拟 rev )sed /\\n/!G;s/\\( \\)\\( *\\n\\)/&\\ \\ /;//D;s/ // # 将每两行连接成一行(类似 paste )sed $!N;s/\\n/ /
# 如果当前行以反斜杠 \\ 结束 则将下一行并到当前行末尾# 并去掉原来行尾的反斜杠sed e :a e /\\\\$/N; s/\\\\\\n//; ta # 如果当前行以等号开头 将当前行并到上一行末尾# 并以单个空格代替原来行头的 = sed e :a e $!N;s/\\n=/ /;ta e P;D # 为数字字串增加逗号分隔符号 将 改为 gsed :a;s/\\B[ ]\\ \\\\>/ &/;ta # GNU sedsed e :a e s/\\( *[ ]\\)\\([ ]\\ \\\\)/\\ \\ /;ta # 其他sed# 为带有小数点和负号的数值增加逗号分隔符(GNU sed)gsed r :a;s/(^|[^ ])([ ]+)([ ] )/\\ \\ \\ /g;ta # 在每 行后增加一空白行(在第 等行后增加一空白行)gsed ~ G # 只对GNU sed有效sed n;n;n;n;G; # 其他sed
选择性地显示特定行
# 显示文件中的前 行(模拟 head 的行为)sed q# 显示文件中的第一行(模拟 head 命令)sed q# 显示文件中的最后 行(模拟 tail )sed e :a e $q;N; $D;ba
# 显示文件中的最后 行(模拟 tail 命令)sed $!N;$!D # 显示文件中的最后一行(模拟 tail )sed $!d # 方法 sed n $p # 方法 # 显示文件中的倒数第二行sed e $!h;d; e x # 当文件中只有一行时 输入空行sed e $q; e $!h;d; e x # 当文件中只有一行时 显示该行sed e $d; e $!h;d; e x # 当文件中只有一行时 不输出# 只显示匹配正则表达式的行(模拟 grep )sed n /regexp/p # 方法 sed /regexp/!d # 方法 # 只显示 不 匹配正则表达式的行(模拟 grep v )sed n /regexp/!p # 方法 与前面的命令相对应sed /regexp/d # 方法 类似的语法
# 查找 regexp 并将匹配行的上一行显示出来 但并不显示匹配行sed n /regexp/g; !p;;h # 查找 regexp 并将匹配行的下一行显示出来 但并不显示匹配行sed n /regexp/n;p; # 显示包含 regexp 的行及其前后行 并在第一行之前加上 regexp 所# 在行的行号(类似 grep A B )sed n e /regexp/=;x; !p;g;$!N;p;D; e h# 显示包含 AAA BBB 或 CCC 的行(任意次序)
sed /AAA/!d; /BBB/!d; /CCC/!d # 字串的次序不影响结果# 显示包含 AAA BBB 和 CCC 的行(固定次序)sed /AAA *BBB *CCC/!d # 显示包含 AAA BBB 或 CCC 的行(模拟 egrep )sed e /AAA/b e /BBB/b e /CCC/b e d # 多数sedgsed /AAA\\|BBB\\|CCC/!d # 对GNU sed有效# 显示包含 AAA 的段落(段落间以空行分隔)# HHsed v 必须在 x; 后加入 G; 接下来的 个脚本都是这样sed e / /H;$!d; e x;/AAA/!d; # 显示包含 AAA BBB 和 CCC 三个字串的段落(任意次序)sed e / /H;$!d; e x;/AAA/!d;/BBB/!d;/CCC/!d # 显示包含 AAA BBB CCC 三者中任一字串的段落(任意次序)sed e / /H;$!d; e x;/AAA/b e /BBB/b e /CCC/b e dgsed / /H;$!d;;x;/AAA\\|BBB\\|CCC/b;d # 只对GNU sed有效
# 显示包含 个或以上字符的行sed n /^ \\ \\/p # 显示包含 个以下字符的行sed n /^ \\ \\/!p # 方法 与上面的脚本相对应sed /^ \\ \\/d # 方法 更简便一点的方法# 显示部分文本——从包含正则表达式的行开始到最后一行结束sed n /regexp/ $p # 显示部分文本——指定行号范围(从第 至第 行 含 和 行)
sed n p # 方法 sed !d # 方法 # 显示第 行sed n p # 方法 sed !d # 方法 sed q;d # 方法 处理大文件时更有效率# 从第 行开始 每 行显示一次gsed n ~ p # 只对GNU sed有效sed n $p;n;n;n;n;n;n; # 其他sed# 显示两个正则表达式之间的文本(包含)sed n /Iowa/ /Montana/p # 区分大小写方式
选择性地删除特定行
# 显示通篇文档 除了两个正则表达式之间的内容sed /Iowa/ /Montana/d # 删除文件中相邻的重复行(模拟 uniq )# 只保留重复行中的第一行 其他行删除sed $!N; /^\\( *\\)\\n\\ $/!P; D # 删除文件中的重复行 不管有无相邻 注意hold space所能支持的缓存# 大小 或者使用GNU sed sed n G; s/\\n/&&/; /^\\([ ~]*\\n\\) *\\n\\ /d; s/\\n//; h; P # 删除除重复行外的所有行(模拟 uniq d )sed $!N; s/^\\( *\\)\\n\\ $/\\ /; t; D
# 删除文件中开头的 行sed d # 删除文件中的最后一行sed $d # 删除文件中的最后两行sed N;$!P;$!D;$d # 删除文件中的最后 行sed e :a e $d;N; ba e P;D # 方法 sed n e :a e !P;N;D;;N;ba # 方法 # 删除 的倍数行gsed ~ d # 只对GNU sed有效sed n;n;n;n;n;n;n;d; # 其他sed# 删除匹配式样的行sed /pattern/d # 删除含pattern的行 当然pattern # 可以换成任何有效的正则表达式
# 删除文件中的所有空行(与 grep 效果相同)sed /^$/d # 方法 sed / /!d # 方法 # 只保留多个相邻空行的第一行 并且删除文件顶部和尾部的空行 # (模拟 cat s )sed / / /^$/!d #方法 删除文件顶部的空行 允许尾部保留一空行sed /^$/N;/\\n$/D #方法 允许顶部保留一空行 尾部不留空行
# 只保留多个相邻空行的前两行 sed /^$/N;/\\n$/N;//D # 删除文件顶部的所有空行sed / / $!d # 删除文件尾部的所有空行sed e :a e /^\\n*$/$d;N;ba e # 对所有sed有效sed e :a e /^\\n*$/N;/\\n$/ba # 同上 但只对gsed *有效# 删除每个段落的最后一行sed n /^$/p;h;;/ /x;/ /p;
特殊应用
# 移除手册页(man page)中的nroff标记 在Unix System V或bash shell下使# 用 echo 命令时可能需要加上 e 选项 sed s/ `echo \\\\\\b`//g # 外层的双括号是必须的(Unix环境)sed s/ ^H//g # 在bash或tcsh中 按Ctrl V 再按Ctrl Hsed s/ \\x //g # sed GNU sed ssed所使用的十六进制的表示方法# 提取新闻组或e mail 的邮件头sed /^$/q # 删除第一行空行后的所有内容# 提取新闻组或e mail 的正文部分sed /^$/d # 删除第一行空行之前的所有内容# 从邮件头提取 Subject (标题栏字段) 并移除开头的 Subject: 字样sed /^Subject: */!d; s///;q
# 从邮件头获得回复地址sed /^Reply To:/q; /^From:/h; / /d;g;q # 获取邮件地址 在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮# 地址的部分剃除 (见上一脚本)sed s/ *( *)//; s/> *//; s/ *[:<] *// # 在每一行开头加上一个尖括号和空格(引用信息)sed s/^/> / # 将每一行开头处的尖括号和空格删除(解除引用)sed s/^> // # 移除大部分的HTML标签(包括跨行标签)sed e :a e s/<[^>]*>//g;/</N;//ba # 将分成多卷的uuencode文件解码 移除文件头信息 只保留uuencode编码部分 # 文件必须以特定顺序传给sed 下面第一种版本的脚本可以直接在命令行下输入 # 第二种版本则可以放入一个带执行权限的shell脚本中 (由Rahul Dhesi的一# 个脚本修改而来 )
sed /^end/ /^begin/d file file fileX | uudecode # vers sed /^end/ /^begin/d $@ | uudecode # vers # 将文件中的段落以字母顺序排序 段落间以(一行或多行)空行分隔 GNU sed使用# 字元 \\v 来表示垂直制表符 这里用它来作为换行符的占位符——当然你也可以# 用其他未在文件中使用的字符来代替它 sed / /H;d;;x;s/\\n/=NL=/g file | sort | sed s/=NL=//;s/=NL=/\\n/g gsed / /H;d;x;y/\\n/\\v/ file | sort | sed s/\\v//;y/\\v/\\n/ # 分别压缩每个 TXT文件 压缩后删除原来的文件并将压缩后的 ZIP文件# 命名为与原来相同的名字(只是扩展名不同) (DOS环境 dir /b
# 显示不带路径的文件名) echo @echo off >zipup batdir /b * txt | sed s/^\\( *\\)\\ TXT/pkzip mo \\ \\ TXT/ >>zipup bat使用SED Sed接受一个或多个编辑命令 并且每读入一行后就依次应用这些命令 当读入第一行输入后 sed对其应用所有的命令 然后将结果输出 接着再读入第二行输入 对其应用所有的命令……并重复这个过程 上一个例子中sed由标准输入设备(即命令解释器 通常是以管道输入的形式)获得输入 在命令行给出一个或多个文件名作为参数时 这些文件取代标准输入设备成为sed的输入 sed的输出将被送到标准输出(显示器) 因此 cat filename | sed q # 使用管道输入sed q filename # 同样效果 但不使用管道输入sed q filename > newfile # 将输出转移(重定向)到磁盘上
要了解sed命令的使用说明 包括如何通过脚本文件(而非从命令行)来使用这些命令 请参阅《sed & awk》第二版 作者Dale Dougherty和Arnold Robbins(O Reilly ) 《UNIX Text Processing》 作者Dale Dougherty和Tim O Reilly(Hayden Books )或者是Mike Arst写的教程——压缩包的名称是 U SEDIT ZIP (在许多站点上都找得到) 要发掘sed的潜力 则必须对 正则表达式 有足够的理解 正则表达式的资料可以看《Mastering Regular Expressions》作者Jeffrey Friedl(O reilly ) Unix系统所提供的手册页( man )也会有所帮助(试一下这些命令 man sed man regexp 或者看 man ed 中关于正则表达式的部分) 但手册提供的信息比较 抽象 ——这也是它一直为人所诟病的 不过 它本来就不是用来教初学者如何使用sed或正则表达式的教材 而只是为那些熟悉这些工具的人提供的一些文本参考
括号语法 前面的例子对sed命令基本上都使用单引号( )而非双引号( )这是因为sed通常是在Unix平台上使用 单引号下 Unix的shell(命令解释器)不会对美元符($)和后引号(` `)进行解释和执行 而在双引号下美元符会被展开为变量或参数的值 后引号中的命令被执行并以输出的结果代替后引号中的内容 而在 csh 及其衍生的shell中使用感叹号(!)时需要在其前面加上转义用的反斜杠(就像这样 \\!)以保证上面所使用的例子能正常运行(包括使用单引号的情况下) DOS版本的Sed则一律使用双引号( )而不是引号来圈起命令 \\t 的用法 为了使本文保持行文简洁 我们在脚本中使用 \\t 来表示一个制表符 但是现在大部分版本的sed还不能识别 \\t 的简写方式 因此当在命令行中为脚本输入制表符时 你应该直接按TAB键来输入制表符而不是输入 \\t 下列的工具软件都支持 \\t 做为一个正则表达式的字元来表示制表符 awk perl HHsed sedmod以及GNU sed v
不同版本的SED 不同的版本间的sed会有些不同之处 可以想象它们之间在语法上会有差异 具体而言 它们中大部分不支持在编辑命令中间使用标签(:name)或分支命令(b t) 除非是放在那些的末尾 这篇文档中我们尽量选用了可移植性较高的语法 以使大多数版本的sed的用户都能使用这些脚本 不过GNU版本的sed允许使用更简洁的语法 想像一下当读者看到一个很长的命令时的心情 sed e /AAA/b e /BBB/b e /CCC/b e d好消息是GNU sed能让命令更紧凑 sed /AAA/b;/BBB/b;/CCC/b;d # 甚至可以写成sed /AAA\\|BBB\\|CCC/b;d 此外 请注意虽然许多版本的sed接受象 /one/ s/RE /RE / 这种在 s 前带有空格的命令 但这些版本中有些却不接受这样的命令: /one/! s/RE /RE / 这时只需要把中间的空格去掉就行了
速度优化 当由于某种原因(比如输入文件较大 处理器或硬盘较慢等)需要提高
命令执行速度时 可以考虑在替换命令( s/ / / )前面加上地址表达式来提高速度 举例来说 sed s/foo/bar/g filename # 标准替换命令sed /foo/ s/foo/bar/g filename # 速度更快sed /foo/ s//bar/g filename # 简写形式当只需要显示文件的前面的部分或需要删除后面的内容时 可以在脚本中使用 q 命令(退出命令) 在处理大的文件时 这会节省大量时间 因此 sed n p filename # 显示第 到 行sed n q; p filename # 一样 但快得多
如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方 请发电子邮件给本文档的作者(Eric Pement) 邮件中请记得提供你所使用的sed版本 该sed所运行的操作系统及对问题的适当描述 本文所指的单行脚本指命令行的长度在 个字符或 个以下的sed脚本〔译注 〕
相关参考
DB2常用傻瓜问题1000问(四)第1/2页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!正在看的
一个简单的PHP&MYSQL留言板源码第1/2页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!初学
安装MYSQL后更改了ROOT的密码后用 net startmysql 启动时我就遇到了这样的问题.使用以下命令后 c:\\mysql\\bin\\
知识大全 一个AJAX自动完成功能的js封装源码[支持中文]第1/2页
一个AJAX自动完成功能的js封装源码[支持中文]第1/2页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
某局机关正在组织人力编辑一本《文件汇编》,其页数需要用6869个数字,请问,这本《文件汇编》具体是多少页
某局机关正在组织人力编辑一本《文件汇编》,其页数需要用6869个数字,请问,这本《文件汇编》具体是多少页?A、1994B、1968C、1942D、1886答案:A解析:1-9页需要9个数字;10-99
大家好下面讨论一下关于tomcat快速启动及自动重启的方法与脚本 值班时会遇到tomcat服务需要手动重启的问题为减少对应用的影响提高响应速度可以将tomcat启动(或重启)写成类似系统服务启动
<%@language="vbscript"codepage=%> <%optionexplicit强制定义变量dimidcount记录总数dimpages每页条数dimpag
思路用纯JS的方法只能通过判断当前页面的文件名然后算出上下页地址首页和尾页需要在脚本中配置好最后生成导航代码用数据绑定的方法则要简单得多设定dataPageSize然后用firstPage()pr
批量安装windows补丁的脚本创建installbat文件编辑该文件输入一下脚本 复制代码代码如下: @echoofffor%%iin(*exe)do%%i/passive/norestart/
“七情”之一。是单用一药以发挥效能,如“甘草汤”、“独参汤”(参阅第四类的“七情“条)。