|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln
SED单行剧本疾速参考(Unix流编纂器)2005年12月29日
英文题目:USEFULONE-LINESCRIPTSFORSED(Unixstreameditor)
原题目:HANDYONE-LINERSFORSED(Unixstreameditor)
收拾:EricPement-电邮:pemente[at]northpark[dot]edu版本5.5
译者:JoeHong-电邮:hq00e[at]126[dot]com
在以下地点可找到本文档的最新(英文)版本:
http://sed.sourceforge.net/sed1line.txt
http://www.pement.org/sed/sed1line.txt
其他言语版本:
中文-http://sed.sourceforge.net/sed1line_zh-CN.html
捷克语-http://sed.sourceforge.net/sed1line_cz.html
荷语-http://sed.sourceforge.net/sed1line_nl.html
法语-http://sed.sourceforge.net/sed1line_fr.html
德语-http://sed.sourceforge.net/sed1line_de.html
葡语-http://sed.sourceforge.net/sed1line_pt-BR.html
文本距离:
--------
#在每行前面增添一空行
sedG
#将本来的一切空行删除并在每行前面增添一空行。
#如许在输入的文本中每行前面将有且只要一空行。
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,见本文开端关于" "的用法的形貌)而不是空格来对齐边沿。
sed=filename|sed"N;s// /"
#对文件中的一切行编号(行号在左,笔墨右端对齐)。
sed=filename|sed"N;s/^//;s/*(.{6,})/1/"
#对文件中的一切行编号,但只显现非空缺行的行号。
sed"/./="filename|sed"/./N;s///"
#盘算行数(摹拟"wc-l")
sed-n"$="
文本转换和替换:
--------
#Unix情况:转换DOS的新行符(CR/LF)为Unix格局。
sed"s/.$//"#假定一切行以CR/LF停止
sed"s/^M$//"#在bash/tcsh中,将按Ctrl-M改成按Ctrl-V
sed"s/x0D$//"#ssed、gsed3.02.80,及更高版本
#Unix情况:转换Unix的新行符(LF)为DOS格局。
sed"s/$/`echo-e`/"#在ksh下所利用的命令
sed"s/$""/`echo`/"#在bash下所利用的命令
sed"s/$/`echo`/"#在zsh下所利用的命令
sed"s/$//"#gsed3.02.80及更高版本
#DOS情况:转换Unix新行符(LF)为DOS格局。
sed"s/$//"#办法1
sed-np#办法2
#DOS情况:转换DOS新行符(CR/LF)为Unix格局。
#上面的剧本只对UnxUtilssed4.0.7及更高版本无效。要辨认UnxUtils版本的
#sed能够经由过程其独有的“--text”选项。你可使用匡助选项(“--help”)看
#个中有没有一个“--text”项以此来判别所利用的是不是是UnxUtils版本。别的DOS
#版本的的sed则没法举行这一转换。但能够用“tr”来完成这一转换。
sed"s///"infile>outfile#UnxUtilssedv4.0.7或更高版本
tr-d<infile>outfile#GNUtr1.22或更高版本
#将每行前导的“空缺字符”(空格,制表符)删除
#使之左对齐
sed"s/^[]*//"#见本文开端关于" "用法的形貌
#将每行拖尾的“空缺字符”(空格,制表符)删除
sed"s/[]*$//"#见本文开端关于" "用法的形貌
#将每行中的前导和拖尾的空缺字符删除
sed"s/^[]*//;s/[]*$//"
#在每行开首处拔出5个空格(使全文向右挪动5个字符的地位)
sed"s/^//"
#以79个字符为宽度,将一切文本右对齐
sed-e:a-e"s/^.{1,78}$/&/;ta"#78个字符外加最初的一个空格
#以79个字符为宽度,使一切文本居中。在办法1中,为了让文本居中每行的前
#头和背面都添补了空格。在办法2中,在居中文本的过程当中只在文本的后面添补
#空格,而且终极这些空格将有一半会被删除。别的每行的背面并未添补空格。
sed-e:a-e"s/^.{1,77}$/&/;ta"#办法1
sed-e:a-e"s/^.{1,77}$/&/;ta"-e"s/(*)1/1/"#办法2
#在每行中查找字串“foo”,并将找到的“foo”交换为“bar”
sed"s/foo/bar/"#只交换每行中的第一个“foo”字串
sed"s/foo/bar/4"#只交换每行中的第四个“foo”字串
sed"s/foo/bar/g"#将每行中的一切“foo”都换成“bar”
sed"s/(.*)foo(.*foo)/1bar2/"#交换倒数第二个“foo”
sed"s/(.*)foo/1bar/"#交换最初一个“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"#只对GNUsed无效
#颠倒一切行,第一行成为最初一行,顺次类推(摹拟“tac”)。
#因为某些缘故原由,利用上面命令时HHsedv1.5会将文件中的空行删除
sed"1!G;h;$!d"#办法1
sed-n"1!G;h;$p"#办法2
#将行中的字符逆序分列,第一个字成为最初一字,……(摹拟“rev”)
sed"//!G;s/(.)(.*)/&21/;//D;s/.//"
#将每两行毗连成一行(相似“paste”)
sed"$!N;s///"
#假如以后行以反斜杠“”停止,则将下一行并到以后行开端
#并往失落本来行尾的反斜杠
sed-e:a-e"/$/N;s///;ta"
#假如以后行以等号开首,将以后行并到上一行开端
#并以单个空格取代本来行头的“=”
sed-e:a-e"$!N;s/=//;ta"-e"P;D"
#为数字字串增添逗号分开标记,将“1234567”改成“1,234,567”
gsed":a;s/B[0-9]{3}>/,&/;ta"#GNUsed
sed-e:a-e"s/(.*[0-9])([0-9]{3})/1,2/;ta"#其他sed
#为带有小数点和负号的数值增添逗号分开符(GNUsed)
gsed-r":a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/12,3/g;ta"
#在每5行后增添一空缺行(在第5,10,15,20,等行后增添一空缺行)
gsed"0~5G"#只对GNUsed无效
sed"n;n;n;n;G;"#其他sed
选择性地显现特定行:
--------
#显现文件中的前10行(摹拟“head”的举动)
sed10q
#显现文件中的第一行(摹拟“head-1”命令)
sedq
#显现文件中的最初10行(摹拟“tail”)
sed-e:a-e"$q;N;11,$D;ba"
#显现文件中的最初2行(摹拟“tail-2”命令)
sed"$!N;$!D"
#显现文件中的最初一行(摹拟“tail-1”)
sed"$!d"#办法1
sed-n"$p"#办法2
#显现文件中的倒数第二行
sed-e"$!{h;d;}"-ex#当文件中只要一行时,输出空行
sed-e"1{$q;}"-e"$!{h;d;}"-ex#当文件中只要一行时,显现该行
sed-e"1{$d;}"-e"$!{h;d;}"-ex#当文件中只要一行时,不输入
#只显现婚配正则表达式的行(摹拟“grep”)
sed-n"/regexp/p"#办法1
sed"/regexp/!d"#办法2
#只显现“不”婚配正则表达式的行(摹拟“grep-v”)
sed-n"/regexp/!p"#办法1,与后面的命令绝对应
sed"/regexp/d"#办法2,相似的语法
#查找“regexp”并将婚配行的上一行显现出来,但其实不显现婚配行
sed-n"/regexp/{g;1!p;};h"
#查找“regexp”并将婚配行的下一行显现出来,但其实不显现婚配行
sed-n"/regexp/{n;p;}"
#显现包括“regexp”的行及其前先行,并在第一行之前加上“regexp”所
#外行的行号(相似“grep-A1-B1”)
sed-n-e"/regexp/{=;x;1!p;g;$!N;p;D;}"-eh
#显现包括“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"-ed#多半sed
gsed"/AAA|BBB|CCC/!d"#对GNUsed无效
#显现包括“AAA”的段落(段落间以空行分开)
#HHsedv1.5必需在“x;”后到场“G;”,接上去的3个剧本都是如许
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"-ed
gsed"/./{H;$!d;};x;/AAA|BBB|CCC/b;d"#只对GNUsed无效
#显现包括65个或以上字符的行
sed-n"/^.{65}/p"
#显现包括65个以下字符的行
sed-n"/^.{65}/!p"#办法1,与下面的剧本绝对应
sed"/^.{65}/d"#办法2,更烦琐一点的办法
#显现部分文本——从包括正则表达式的行入手下手到最初一行停止
sed-n"/regexp/,$p"
#显现部分文本——指定行号局限(从第8至第12行,含8和12行)
sed-n"8,12p"#办法1
sed"8,12!d"#办法2
#显现第52行
sed-n"52p"#办法1
sed"52!d"#办法2
sed"52q;d"#办法3,处置年夜文件时更无效率
#从第3行入手下手,每7行显现一次
gsed-n"3~7p"#只对GNUsed无效
sed-n"3,${p;n;n;n;n;n;n;}"#其他sed
#显现两个正则表达式之间的文本(包括)
sed-n"/Iowa/,/Montana/p"#辨别巨细写体例
选择性地删除特定行:
--------
#显现通篇文档,除两个正则表达式之间的内容
sed"/Iowa/,/Montana/d"
#删除文件中相邻的反复行(摹拟“uniq”)
#只保存反复行中的第一行,其他行删除
sed"$!N;/^(.*)1$/!P;D"
#删除文件中的反复行,不论有没有相邻。注重holdspace所能撑持的缓存
#巨细,大概利用GNUsed。
sed-n"G;s//&&/;/^([-~]*).*1/d;s///;h;P"
#删除除反复行外的一切行(摹拟“uniq-d”)
sed"$!N;s/^(.*)1$/1/;t;D"
#删除文件中开首的10行
sed"1,10d"
#删除文件中的最初一行
sed"$d"
#删除文件中的最初两行
sed"N;$!P;$!D;$d"
#删除文件中的最初10行
sed-e:a-e"$d;N;2,10ba"-e"P;D"#办法1
sed-n-e:a-e"1,10!{P;N;D;};N;ba"#办法2
#删除8的倍数行
gsed"0~8d"#只对GNUsed无效
sed"n;n;n;n;n;n;n;d;"#其他sed
#删除婚配式样的行
sed"/pattern/d"#删除含pattern的行。固然pattern
#能够换成任何无效的正则表达式
#删除文件中的一切空行(与“grep"."”效果不异)
sed"/^$/d"#办法1
sed"/./!d"#办法2
#只保存多个相邻空行的第一行。而且删除文件顶部和尾部的空行。
#(摹拟“cat-s”)
sed"/./,/^$/!d"#办法1,删除文件顶部的空行,同意尾部保存一空行
sed"/^$/N;/$/D"#办法2,同意顶部保存一空行,尾部不留空行
#只保存多个相邻空行的前两行。
sed"/^$/N;/$/N;//D"
#删除文件顶部的一切空行
sed"/./,$!d"
#删除文件尾部的一切空行
sed-e:a-e"/^*$/{$d;N;ba"-e"}"#对一切sed无效
sed-e:a-e"/^*$/N;/$/ba"#同上,但只对gsed3.02.*无效
#删除每一个段落的最初一行
sed-n"/^$/{p;h;};/./{x;/./p;}"
特别使用:
--------
#移除手册页(manpage)中的nroff标志。在UnixSystemV或bashshell下使
#用"echo"命令时大概必要加上-e选项。
sed"s/.`echo`//g"#外层的双括号是必需的(Unix情况)
sed"s/.^H//g"#在bash或tcsh中,按Ctrl-V再按Ctrl-H
sed"s/.x08//g"#sed1.5,GNUsed,ssed所利用的十六进制的暗示办法
#提取旧事组或e-mail的邮件头
sed"/^$/q"#删除第一行空行后的一切内容
#提取旧事组或e-mail的注释部分
sed"1,/^$/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剧本中。(由RahulDhesi的一
#个剧本修正而来。)
sed"/^end/,/^begin/d"file1file2...fileX|uudecode#vers.1
sed"/^end/,/^begin/d""$@"|uudecode#vers.2
#将文件中的段落以字母按次排序。段落间以(一行或多行)空行分开。GNUsed利用
#字元“v”来暗示垂直制表符,这里用它来作为换行符的占位符——固然你也能够
#用其他未在文件中利用的字符来取代它。
sed"/./{H;d;};x;s//={NL}=/g"file|sort|sed"1s/={NL}=//;s/={NL}=//g"
gsed"/./{H;d};x;y//v/"file|sort|sed"1s/v//;y/v//"
#分离紧缩每一个.TXT文件,紧缩后删除本来的文件并将紧缩后的.ZIP文件
#定名为与本来不异的名字(只是扩大名分歧)。(DOS情况:“dir/b”
#显现不领路径的文件名)。
echo@echooff>zipup.bat
dir/b*.txt|sed"s/^(.*).TXT/pkzip-mo11.TXT/">>zipup.bat
利用SED:Sed承受一个或多个编纂命令,而且每读进一行后就顺次使用这些命令。
当读进第一行输出后,sed对其使用一切的命令,然后将了局输入。接着再读进第二
行输出,对其使用一切的命令……偏重复这个历程。上一个例子中sed由尺度输出设
备(即命令注释器,一般是以管道输出的情势)取得输出。在命令行给出一个或多
个文件名作为参数时,这些文件代替尺度输出设备成为sed的输出。sed的输入将被
送到尺度输入(显现器)。因而:
catfilename|sed"10q"#利用管道输出
sed"10q"filename#一样效果,但不利用管道输出
sed"10q"filename>newfile#将输入转移(重定向)到磁盘上
要懂得sed命令的利用申明,包含怎样经由过程剧本文件(而非从命令行)来利用这些命
令,请参阅《sed&awk》第二版,作者DaleDougherty和ArnoldRobbins
(O"Reilly,1997;http://www.ora.com),《UNIXTextProcessing》,作者
DaleDougherty和TimO"Reilly(HaydenBooks,1987)大概是MikeArst写的教
程——紧缩包的称号是“U-SEDIT2.ZIP”(在很多站点上都找失掉)。要开掘sed
的潜力,则必需对“正则表达式”有充足的了解。正则表达式的材料能够看
《MasteringRegularExpressions》作者JeffreyFriedl(O"reilly1997)。
Unix体系所供应的手册页(“man”)也会有所匡助(试一下这些命令
“mansed”、“manregexp”,大概看“maned”中关于正则表达式的部分),但
手册供应的信息对照“笼统”——这也是它一向为人所诟病的。不外,它原本就不
是用来教初学者怎样利用sed或正则表达式的课本,而只是为那些熟习这些工具的人
供应的一些文本参考。
括号语法:后面的例子对sed命令基础上都利用单引号("...")而非双引号
("...")这是由于sed一般是在Unix平台上利用。单引号下,Unix的shell(命令
注释器)不会对美圆符($)和后引号(`...`)举行注释和实行。而在双引号下
美圆符会被睁开为变量或参数的值,后引号中的命令被实行并以输入的了局取代
后引号中的内容。而在“csh”及其衍生的shell中利用叹息号(!)时必要在其前
面加上本义用的反斜杠(就像如许:!)以包管下面所利用的例子能一般运转
(包含利用单引号的情形下)。DOS版本的Sed则一概利用双引号("...")而不是
引号来圈起命令。
" "的用法:为了使本文坚持行文简便,我们在剧本中利用" "来暗示一个制表
符。可是如今年夜部分版本的sed还不克不及辨认" "的简写体例,因而当在命令行中为
剧本输出制表符时,你应当间接按TAB键来输出制表符而不是输出" "。以下的工
具软件都撑持" "做为一个正则表达式的字元来暗示制表符:awk、perl、HHsed、
sedmod和GNUsedv3.02.80。
分歧版本的SED:分歧的版本间的sed会有些分歧的地方,能够设想它们之间在语法上
会有差别。详细而言,它们中年夜部分不撑持在编纂命令两头利用标签(:name)或分
支命令(b,t),除非是放在那些的开端。这篇文档中我们只管选用了可移植性较高
的语法,以使年夜多半版本的sed的用户都能利用这些剧本。不外GNU版本的sed同意使
用更简便的语法。想像一下当读者看到一个很长的命令时的心境:
sed-e"/AAA/b"-e"/BBB/b"-e"/CCC/b"-ed
好动静是GNUsed能让命令更松散:
sed"/AAA/b;/BBB/b;/CCC/b;d"#乃至能够写成
sed"/AAA|BBB|CCC/b;d"
别的,请注重固然很多版本的sed承受象“/one/s/RE1/RE2/”这类在"s"前带有空
格的命令,但这些版本中有些却不承受如许的命令:“/one/!s/RE1/RE2/”。这时候
只必要把两头的空格往失落就好了。
速率优化:当因为某种缘故原由(好比输出文件较年夜、处置器或硬盘较慢等)必要进步
命令实行速率时,能够思索在交换命令(“s/.../.../”)后面加上地点表达式来
进步速率。举例来讲:
sed"s/foo/bar/g"filename#尺度交换命令
sed"/foo/s/foo/bar/g"filename#速率更快
sed"/foo/s//bar/g"filename#简写情势
当只必要显现文件的后面的部分或必要删除前面的内容时,能够在剧本中利用“q”
命令(加入命令)。在处置年夜的文件时,这会节俭大批工夫。因而:
sed-n"45,50p"filename#显现第45到50行
sed-n"51q;45,50p"filename#一样,但快很多
假如你有其他的单行剧本想与人人分享大概你发明了本文档中毛病的中央,请发电
子邮件给本文档的作者(EricPement)。邮件中请记得供应你所利用的sed版本、
该sed所运转的操纵体系及对成绩的得当形貌。本文所指的单行剧本指命令行的长
度在65个字符或65个以下的sed剧本〔译注1〕。本文档的各类剧本是由以下所列作
者所写或供应:
AlAab#创建了“seders”邮件列表
EdgarAllen#很多方面
YiorgosAdamopoulos#很多方面
DaleDougherty#《sed&awk》作者
CarlosDuarte#《doitwithsed》作者
EricPement#本文档的作者
KenPizzini#GNUsedv3.02的作者
S.G.Ravenhall#往html标签剧本
GregUbben#有诸多奉献并供应了很多匡助
-------------------------------------------------------------------------
译注1:年夜部分情形下,sed剧本不管多长都能写成单行的情势(经由过程`-e"选项和`;"
号)——只需命令注释器撑持,以是这里说的单行剧本除能写成一行还对长度有
所限定。由于这些单行剧本的意义不在于它们是以单行的情势呈现。而是让用户能
便利地在命令行中利用这些松散的剧本才是其意义地点。
要多动手,不要怕什么搞坏了怎么办,你不搞坏,不去动手,就永远不会有收获,既然你在linux中是自由的,那就发挥自己的权利; |
|