感谢支持
我们一直在努力

Linux sed 流编辑器的一些应用实例

1. 首先注意sed的作用是什么?本质是什么?本质就是自动的编辑器!也就是在脚本代码
 
  中进行控制的!使编辑文件的过程自动化,以便用“批处理”方式编辑文件
2.    sed是基于行的,因此按顺序对每一行执行命令。
3.    参数
    sed: invalidoption — h
    用法: sed[选项]… {脚本(如果没有其他脚本)} [输入文件]…


    -n, –quiet,–silent
                取消自动打印模式空间
                也就是所有的显示都是由自己控制的!!!
     -e 脚本,–expression=脚本
                添加“脚本”到程序的运行列表
    -f 脚本文件,–file=脚本文件
                添加“脚本文件”到程序的运行列表
    -i[扩展名],–in-place[=扩展名]
                直接修改文件(如果指定扩展名就备份文件)
    -l N,–line-length=N
                指定“l”命令的换行期望长度
   –posix
                关闭所有 GNU 扩展
    -r,–regexp-extended
                在脚本中使用扩展正则表达式
    -s,–separate
                将输入文件视为各个独立的文件而不是一个长的连续输入
    -u,–unbuffered
                从输入文件读取最少的数据,更频繁的刷新输出
   –help    打印帮助并退出
   –version  输出版本信息并退出


    如果没有 -e,–expression, -f 或 –file 选项,那么第一个非选项参数被视为
   sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
   输入读取数据。


4.    sed -e’1,10d’ ping.sh >1   
    # 将ping.sh中逐行读取到缓冲区,删除ping.sh文件中1-10行,然后重定向到1文件中


5.    sed -e’/^#/d’ ping.sh > 1  
    #将ping.sh中逐行读取到缓冲区,删除ping.sh文件中第一个字符是#的行,然后重定向到
    1文件中


6.    sed -e’/”/d’ ping.sh > 1        
    # 删除有 “的行,并输出到1文件


7.   字符        描述
   ^       与行首匹配
   $       与行末尾匹配
   \w     与任一个字符匹配
   *        将与 前一个字符的零或多个出现匹配
    []       与 [ ] 之内的所有字符匹配


8.   下面是几个示例:
   规则表达式        描述
   /./             将与包含至少一个字符的任何行匹配           
   —> 也就是说只要有一个字符的行都会输出
  
   /../            将与包含至少两个字符的任何行匹配           
   —> 也就是说只要有两个字符在一起及以上的都会删除
  
   /^#/           将与以 ‘#’开始的任何行匹配                 
   —> 匹配开头( ^ ) 以#的行删除
  
   /^$/          将与所有空行匹配                          
   —> 也就是开头结尾没有东西,所以就是空行删除
   —> sed -e ‘/^$/d’ ping.sh | wc -l >1 将非空行的函数输入到文件1( 删除空行,剩下
        的结果输出到文件 )
  
   /}$/           将与以’}’(无空格)结束的任何行匹配        
   —> sed -e ‘/}$/d’ ping.sh >1          以 }结束的行
  
    /}*^/           将与以 ‘}’ 后面跟有零或多个空格结束的任何行匹配  
  
   /[abc]/          将与包含小写’a’、’b’ 或 ‘c’的任何行匹配     
   —> sed -e ‘/[a-z]/d’ ping.sh >1         将有a-z字母的行都去掉
  
   /^[abc]/        将与以 ‘a’、’b’或 ‘c’开始的任何行匹配        
   —> sed -e ‘/[a-z]/d’ ping.sh >1         将开头是a-z的行都删除
  
  
9.    sed -n -e’/{/,/}/p’ ping.sh >1                          
   —-> 注意这是输出命令(p),是输出{}之间的内容
    请注意新的 ‘-n’选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做。
    您还会注意到,我们用’p’ 命令替换了 ‘d’ 命令,如您所猜想的那样,这明确要求 sed
   打印模式空间。就这样,将只打印匹配部分。
  
10.    sed -n -e’/judge[[:space:]]*(/, /^}/p’  ping.sh>1           
   —-> 输出judge函数的所有内容
   
11.    如何使用 sed来执行字符串替换、创建更大的 sed 脚本以及如何使用 sed 的附加、插
   入和更改行命令。


12.    替换:
    sed -e’s/echo/oche/’     ping.sh > 1                    
   —-> s前缀就是替换命令,就是将ping.sh中出现的echo替换为oche
   —-> 同时注意:只替换每行第一次出现的哦~
   —-> 请注意:这条命令没有改变源文件中的内容,而下面的就是可以的
                                                        
    sed -e’s/echo/oche/g’  ping.sh >1                    
   —-> 将所有的出现的都替换  ( 全局替换吧 )
  
  
   我们需要知道的是,s/// 是一个命令哦,是不可分割的呗~所以我们可以与其他的命
    令一起使用!
    sed -e ‘1,10s/echo/ohce/g’  ping.sh > 1
   —-> 也就是只处理1-10行( 包括1和10 )
   注意:我们要知道的是:1和10指定的行结束,我们也可使用特殊的字符串结束!如
    下:
   sed  -e ‘/^$/, /^}/s/echo/ohce/g’  ping.sh > 1
   —-> 由空行开始执行,直到遇到 } 开始的行结束
  
    注意:我们并没有硬性规定一定是s、/组合,这只是常规的用法,当然也可以使用别的
    字符,例如
    sed -e ‘s:echo:ooo:g’ ping.sh >1      也是可以的哦~
    但是一般在替换的字符串中有/才用这样的方法
    例如:
    sed -e ‘s:pt/ss.ps:pt/ss:g’ ping.sh > 1
  
  
13.    sed -e’s/<.*>//g’ ping.sh >1
   —->将<>形式替换成空格!注意其中有一个 ‘ . ‘,所以最少是一个字符哦~
  
   但是你自己运行一下,这是你需要的结果吗?!!!!
   显然不是不是吗?
   在我的测试代码中的内容是:
    # pt/ss/ps    <>  <> <>  <sdjsdvb>  <…>  <yyyy>
    # <z>
   
    那我本来想留下的结果是:
    #  pt/ss/ps
    #
    但是很不幸的是结果是:
    #  pt/ss/ps
    这就是s///的处理机制不一样呗~!那么他会寻找最长的字符串,我们需要怎么作
    呢!?
    sed -e’s/<[^>]*>//g’ ping.sh > 1
    中间是>的后面不处理
    注意:有一些shell是不支持的!
   
14.  
   注意下面代码的不同:
    对于处理这样一行:<yjasbhdcjsd>  <a>
    sed -e’s/<[a-z]>//g’ ping.sh>1                #注意此处只是匹配一个字符而已
    和
    sed -e’s/<[a-z]*>//g’ ping.sh>1             #此处匹配以字符开头的多个字符
   
  
15.  
    这将匹配零或多个全部为’a’、’b’、’c’…’v’、’w’、’x’ 的字符。另外,可以使用
    ‘[:space:]’字符类来匹配  
   空格。以下是可用字符类的相当完整的列表:
   字符类            描述
   [:alnum:]           字母数字 [a-zA-Z 0-9]
   [:alpha:]           字母 [a-zA-Z]
   [:blank:]           空格或制表键
   [:cntrl:]              任何控制字符
   [:digit:]              数字[0-9]
   [:graph:]          任何可视字符(无空格)
   [:lower:]             小写[a-z]
   [:print:]              非控制字符
   [:punct:]           标点字符
   [:space:]           空格
   [:upper:]           大写[A-Z]
   [:xdigit:]           十六进制数字 [0-9a-fA-F]  
  
  
16.   高级替换功能
   我们现在想在所有的行前面加上MM,那么怎么处理呢?是所有的行哦~  
    sed -e’s/.*/MM: &/g’ ping.sh >1     
   —-> 就是 & 符号处理

17.    ‘s///’命令甚至比 ‘&’ 更好,它允许我们在规则表达式中定义区域,然后可以在替换字
   符串中引用这些
    特定区域。
    内容:ping -w 5www.baidu.com
    改为:ssping -w5-www.baidu.com
  
    sed -e’s/\(.*\) \(.*\) \(.*\) \(.*\)/ss\1 \2 \3-\4/g’ ping.sh> 1
  
    那么我们知道后面的\1,\2, \3, \4 就是再次引用!
  
18.   组合使用
   注意多个不同命令之间可以使用“ ; ” 进行隔开处理!
   >:   以下命令系列使用 ‘=’ 命令和 ‘p’ 命令,’=’ 命令告诉 sed 打印行号,’p’ 命令明确告
       诉 sed打印该  
       行(因为处于 ‘-n’模式)。  
       sed -n -e’=;p’ ping.sh > 1
     
       注意“ = ”是表明打印本行的行号,接着后面的p就是打印本行内容!
      但是上面的情况?有些时候不可以执行,那么我们更安全的做法是:
     
       sed -n -e’=’  -e ‘p’  ping.sh> 1
      我们知道-e选项是引入脚本命令,所以是可以的是吧,呵呵~
     
   >:   在使用更为复杂的附加和插入命令时,甚至多个 ‘-e’ 选项也不能帮我们的忙。对于
       复杂的多行脚
      本,最好的方法是将命令放入一个单独的文件中。然后,用 -f 选项引用该脚本文
       件:
         sed -n-f  cmds.sed ping.sh          #注意cmds.sed中是存放命令的哟~
  
   >:   一个地址的多个命令:
       sed -e ‘1,20{ s/echo/ooo/g ;s/sh/ss/g ;s/ping/ppp/g } ‘ ping,sh> 1
      也就是对于同一个文件中的多个字符串一起处理!
      要用{}就好!
     
   >:   sed -e ‘ i\  insert into’ ping.sh > 1
       中间的 \i命令就是将后面的字符串插入到其中!
     
       sed -e ‘a\insert too…’ ping.sh > 1
      效果差不多哦~
     
       c\ You’rehistory, original line! Muhahaha!
       “更改行”命令将实际替换模式空间中的当前行,其用法如下:
      

19.   文本转换
  
   >:   第一个实例脚本将 UNIX 风格的文本转换成 DOS/Windows 格式。您可能知道,基
       于 DOS/
       Windows的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文
       本只有一个换
       行。有时可能需要将某些UNIX 文本移至 Windows 系统,该脚本将为您执行必需的
       格式转换。
     
       sed -e’s/$/\r/’ unix.txt > win.txt
      —-> 此行代码的意思就是在unix文件结尾加上\r的回车字符而已,匹配win下的格式
            哦~
     
      那么我们会知道,if将win转化为unix,那么就是如下代码:
       sed -e’s/.$//’   win.txt > unix
      —-> 也就是去掉最后一个字符!
     
   >:   反转行( 与tac的命令差不多 )
      其实也不叫反转行,就是将文件倒过来,也就是从下往上读,但是对于每一个string
      内部的顺序是不变的哦~
       sed -e’1!G;h;$!d’ ping.sh > 1
       此命令同:tacping.sh > 1
     
      解释sed…:基本的原理有点想“ 压栈出栈 ”的机制,也就是从上到下将每行压入
      到“栈”中,到了指定的最后一行,开始打印出来,最后就是倒序的咯,呵呵~
      具体的就是,1!G就是每次只对第一行开始操作压栈
                  h就是压栈动作
                  $!d就是每次压栈后就删除的前面的行,以便处理后面的行!~
                   如此循环!~
     
     
20.   下面的区别:
  
    sed’/echo/p’ ping.sh >1       #打印所有行,if一些行有echo单词,就再打印一次
   和  
    sed -n’/echo/p’ ping.sh >1    #只打印有echo的行!
     
21.  
    sed ‘3d’datafile   删除第3行
    sed ‘3,$d’datafile   删除从第3行到结束
    sed ‘$d’datafile   删除最后一行
    sed’/north/d’ file  删除匹配north的行  
     
     
22.   & 是追随此行的命令
    sed’s/[a-z][a-z]$/&.xxx/g’ ping.sh >1     
    cat 1
    与
    sed-e  ‘s/.*/I say:&/g’  ping.sh >1       # 每一行的前面加上Isay
    与
    sed -e’s/\(echo\)/\1-ch000/g’ ping.sh >1    #使用\1代表echo是可以的! echo改
   成echo-ch000
    此处使用的 ()可引用的参数变量!
  
  
23.    现在我们已经知道-n 的作用了,if有了-n,那么就是只输出对应的行,if没有,那么就
   是所有的内容都输出,if匹配,就输出2遍!



24.   多重编辑
   所谓多重编辑就是形如前面的:sed -e’1,3d’    -e ‘s/echo/sss/g’ ping.sh >1
  
25.读入内容:( /str/r  命令 )
   如果文件ping.sh中某一行匹配到模式echo,则在该行后读入sss文件的内容。
    sed -e’/echo/r  sss’ ping.sh > 1
   注意:必须有一个sss的文件且有内容才可以看到现象哦~~~
  
26.   写文件  ( /str/w  命令 )
   如果文件ping.sh中某一行匹配到模式echo,则在该行后写入sss文件。
    sed -e’/echo/w  sss’ ping.sh
  
   注意25和26都是针对一行而言的!!!切记!!!
  
27.    追加( /a)
   也就是追加到指定的匹配字符串后面!
    sed -n’/echo/a  xiao_sha_gua’ ping.sh
   其实/a和/r是差不多的,不过一个是从文件中,一个是直接指定而已~~~

28.    插入:( /i)  
   在指定的匹配字符串后面插入str
    sed -e’/echo/i  sss’ ping.sh
   这个和上面的/a和/r也是差不多的哦,呵呵呵~~~
  
29.    下一行命令:( n)  
    sed -e’/judge/  { n; s/echo/ooo/g }’ ping.sh
   请注意:仅仅是相对于judge来说的下一行哦~~~~~,if下一行有echo那么就
   换成ooo,if没哟就算了!!!
  
30.    转换( y)  
   sed  -e  ‘1,10y/abcde/ABCDE/’ping.sh
   注意格式:y和后面的/之间不可以有空格哟~
   功能:将所有指定的小写字母换成了对应的答谢字母,当然你自己可以设置随便怎么替
   换,随便怎么对应,just do it!
  
31.    退出( q)  
    sed -e ‘5q’ping.sh                         打印5行后退出
    sed -e’/echo/{s/echo/oooo/;q;}ping.sh      匹配后换,再退出!
  某行匹配到echo时,先用oooo替换echo,然后立即退出  
  
32.    暂存和取用(h和G )  
    h:就是保存当前模式到一个缓冲区
   G:取出保存的模式
    sed -e’/echo/ { h;d; }’ -e ‘/judge/ G’ ping.sh
  
   相当注意:一个文件中可以有多个echo的匹配的行,那么他们的保存是按照“栈”的形式
   保存的!!就是说,if现在匹配的行的书目比较多,而judge的数量比较少,那么按照“先
   进后出”的原则来进行替换的哦哦 ~  而且注意由于有一个d;所以所有有echo的行都被
    删除了!!!
  
   注意不可以改成
    sed -n -e’/echo/ { h;d; }’ -e ‘/judge/ G’ ping.sh
   那么我将看不到任何内容
   因为-n只是匹配当前行,而当前行有被删除了,所以就是空白的!你可以将d去掉看看
   之后会看到所有匹配的行!!!
  
    我们前面有一串代码是(类似与tac ):sed -e ‘1!G;h;$!d’ ping.sh > 1
  
  
33.   暂存和互换命令    ( h 和x )
    sed -e’/{/h’ -e ‘/}/x’ ping.sh > 1
  
  
34.   在每一行后面增加一空行
      sed G
  
   将原来的空行删除再在每行后面增加一个空行,那么每一行后面就只有一个空行!
    sed ‘{/^$/d;G; }’ ping.sh  |  sed -n -e’/^$/p’  |  wc -l
  
   上面代码的意思就是先删除所有的空行,然后每行后面增加一个空行,然后输出的结果
   输出空行的行数
  
   2的延伸:在每一行后面增加两行空行
              sed'{G;G}’
  
35.    sed’n;d’
   看看这条指令:意思就是删除每行的下一行
   我们可以这样测试:
    sed -e'{/^$/d; G;}’ ping.sh  |  sed ‘{n; d; }’
   如果没有错的话,那么就会最终没有空行,因为后面的sed ‘{ n; d; }’就是走到下一行
   再删除,因为是“有空没空”镶嵌的,所以最终所有空行被删除,呵呵俄~
  
  
36.   在匹配的行之前加入一个空行:
    sed -e’/judge/ { x;p;x; }’  ping.sh  
   解释:我们知道x的作用是将当前行和暂存缓冲区中的内容(也就是前面使用G取出的内
   容)交换,由于初始化的时候是空的,所以执行了第一个x后judge行变成空行,而原本
   的被换到暂存区,然后执行p也就是当前行,那么就是多了一个空行,然后在x,就是将
   暂存区的内容再换回来,所以最后就多了一行,:-) ~
  
   在匹配行之后加入一个空行:
    sed -e’/judge/G’ ping.sh          #这个好理解
  
   那么我们知道在前后各插入一行就是1和2的组合咯!
    sed -e’/judge/ { x;p;x;G; }’ ping.sh
  
37.   关于给行的编号:
   我们在前面已经知道=可以达到效果,但是你测试一下是你希望的吗?好像不是吧,呵
    呵~
    sed =ping.sh
  
    改进:
    sed =ping.sh | sed -e'{N;s/\n/     /}’
    或者
    sed =ping.sh | sed ‘N;s/^/    /; s/ *\(.\{6,\}\)\n/\1  /’
  
   下面接着改进,只显示有内容的行的行号
    sed -e’/./=’  ping.sh |  sed  -e’/./N;s/\n/   /’
   就是前面对于=的选择进行处理,后面对于N的处理也是建立在有内容的行!
  
38.   计算行数,模拟wc
    sed -n ‘$=’ping.sh
   解释:其实是一个凑巧的做法:原理是sed -n ‘=’ ping.sh 是输出所有的行的行号
         但是有了$就是只取最后一个,显然是行的数目咯~呵呵~
  
39.   将每一行前导的“空白字符”(空格,制表符)删除:
     使之左对齐
    sed ‘s/^[\t]*//’ ping.sh
  
   将每一行拖尾的“空白字符”(空格,制表符)删除:
    注意:
    sed -e ‘s/[\t]$//’ ping.sh
    和
    sed -e ‘s/[\t]*$//’ping.sh          #上面的if有多个空格,那么只能删除一个然后剩下的
                                  #空格就不会删除!
   的区别!                       
  
   那么删除前导和后缀空格和tap就是:
    sed -e'{s/^[ \t]*//;s/[ \t]*$//}’
  
40.   在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
  
   按照前面的命令,我们知道这样是可以的:
    sed -e’s/.*/    &/’ping.sh    # 就是对于每行的操作!YES。。。
    或者
    sed’s/^/    /’
  
  
41.   以79个字符为宽度,将所有文本右对齐
     sed -e :a -e’s/^.\{1,78\}$/ &/;ta’  #78个字符外加最后的一个空格  
  
   首先我们需要知道“标签的使用”
    就是形如:sed :aXXXX ‘ta’ping.sh    #注意只能是a作为标签,本意是“添加”作用
   如果仅仅是执行这个代码,那么就是对于每行处理XXXX
  
   那么再看看’s/^.\{1,78\}$/ &/这是什么
   这个很简单:就是从行头开始增加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   42.   只替换每行的第一个echo表示法:
    sed -e’s/echo/ooooooo/’ ping.sh
    或者:
    sed -e’s/echo/ooooooo/1′ ping.sh
  
   只替换每行的第二个echo
    sed -e’s/echo/ooooooo/2’ping.sh  
  
   替换最后一个“echo”
    sed’s/\(.*\)echo/\1ooo/’              
  
   替换倒数第二个“echo”
    sed’s/\(.*\)echo\(.*echo\)/\1 ooo\2/’     

   只在行中出现字串“baz”的情况下将“echo”替换成“ooo”
    sed’/baz/s/echo/ooo/g’


   将“echo”替换成“ooo”,并且只在行中未出现字串“baz”的情况下替换
    sed’/baz/!s/echo/ooo/g’


   替换每行最后一个echo和第一个judge为ooo
    sed -e’s/\(.*\)echo/ooo/; s/judge/ooo/’  ping.sh
    在GNU sed中也可以使用:
    sed -e’s/echo\|judge/ooo/g’ping.sh       # 使用\|


43.   将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
    sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//’
  
  
44.   将每两行连接成一行(类似“paste”)
    sed’$!N;s/\n/ /’                    
                            #那么我们知道哦$!要不要其实没有太大的影响
   要理解这一句那么我们要知道N的意思:   #主要是为了本操作不影响其他的文本内容  
   man中的解释:
    nN    Read/appendthe next line of input into the pattern space.
  
   那么我们知道:只要不是结尾那么就读取下一行到当前的空间,
                每行的结束\n使用空格代替,所以就很好理解了~  
  
45.   如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
   并去掉原来行尾的反斜杠     
  
    第一种:    sed -e’/\\$/ { N; s/\n/ /; s/\\// }’ ping.sh > 1
   解释:   /\\$/:是找到结尾是\的行
             N    :     将下一行的内容链接到本行
             s/\n/ /:将本行的\n换成 ‘ ’
            s/\\//:将\删除
  
   第二种:    sed -e:a -e ‘/\\$/N; s/\\\n//; ta’ ping.sh > 1
            本质是一样的就不解释了!
  
46.   如果当前行以等号开头,将当前行并到上一行末尾( !!! )
    并以单个空格代替原来行头的“=”
    sed -e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’ ping.sh >1
  
47.   为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”  
   说的更清楚一点就从右向左开始以3数字为一组加上‘,’~~~
  
   我们要回顾一下前面的所谓的标签,其实本质是循环
  
    sed -e :a’XXXX;ta;’ping.sh       #命令的循环直到条件不满足
   还要知道3个怎么表示,例如3个数字:/[0-9]\{3\}/      yes,就是这样
  
    所以:sed -e :a-e ‘s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta;’ ping.sh > 1
    解释::a…  ta; 之间类似与一个循环直到条件结束
         \(.*[0-9]\)\([0-9]\{3\}\):意思是任意个数字串+3个数字串的组合,每次处理3个
         \1,\2:就是增加‘,’的处理呗~
  
    注意: gsed’:a;s/\B[0-9]\{3\}\>/,&/;ta’   # GNU 可以这样处理
  
48.   在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
    gsed ‘0~5G’  ping.sh >1                        # 只对GNUsed有效
    sed ‘n;n;n;n;G;’ ping.sh >1                       #其他sed

49.   显示文件中的前10行 (模拟“head”的行为)
    我们有自己的最古老的办法:
    sed -n -e ‘1,10p’ ping.sh
    新的方法:
    sed 10q   ping.sh
   
    显示文件中的第一行 (模拟“head -1”命令)
    sed -n -e’1p’ ping.sh
    或者
    sed qping.sh
  
50.   显示文件中的最后10行 (模拟“tail”)
    sed -e :a -e ‘$q;N;11,$D;ba’
   
    显示文件中的最后2行(模拟“tail -2”命令)
    sed ‘$!N;$!D’
   解释:前面的行我们都知道很easy的被删除,因为D是删除空间第一行
   所以前面的被一一删除,那么到了倒数第二行的时候,依旧会N,所以到了
   最后一行,那么后面一个指令显然此时是在最后一行,那么就不会执行D,
   那么我们也知道现在模式空间就只有2行,按照原理都不会删除,所以
   最终剩下2行!
  
    显示文件中的最后一行(模拟“tail -1”)
    sed’$!d’              # 本质就是:最后一行不删除,其余的在暂存
                       # 空间删除,所以最后就打印了最后一行
    sed -n’$p’           # 本质就是最后一行打印( -n:所以只打印相应行 )
  
  
   到这里是应该要说说-d和-D的区别了!!!
   -d:删除当前行
   -D:仅删除模式空间的第一行
  
51.   倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
   由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
    sed’1!G;h;$!d’                  # 方法1
  
    #解释:首先是入栈和删除阶段,由于还没有入栈完全的时候肯定都是在
           第一行,所以入栈全部OK之前第一行是不会执行的!第二行都执行
           然后删除第一行,所以第二行又成为第一行,直到模式空间为空,
           那么就不是第一行了,所以第一个命令开始执行,而且此后都是指向
           最后一行,所以第一个指令不断执行,直到暂存空间为空!然后后面的
           删除命令由于是最后一行,没有内容了,所以结束。。。
  
    sed -n’1!G;h;$p’                #方法2  
  
52.   显示文件中的倒数第二行
    sed -e ‘$!{h;d;}’ -ex             # 当文件中只有一行时,输入空行
    sed -e ‘1{$q;}’ -e ‘$!{h;d;}’ -e x  #当文件中只有一行时,显示该行
    sed -e ‘1{$d;}’ -e ‘$!{h;d;}’ -e x  #当文件中只有一行时,不输出

53.   只显示匹配正则表达式的行(模拟“grep”)
    sed -n’/regexp/p’              # 方法1
    sed’/regexp/!d’                # 方法2
   
   只显示“不”匹配正则表达式的行(模拟“grep -v”)
    sed -n’/regexp/!p’             # 方法1,与前面的命令相对应
    sed’/regexp/d’                 # 方法2,类似的语法
 
54.   查找“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;}’ -e h
  
55.   显示包含“echo”或“judge”行(任意次序)
    sed -n -e’/echo/p; /judge/p’ ping.sh > 1
    或
    sed -e’/echo!d/; /judge/!d’ ping.sh > 1
  
   显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
    sed -n -e’/AAA.*BBB.*CCC.*/p’ ping.sh  >1
  
   显示包含“AAA”“BBB”或“CCC”的行(模拟“egrep”)  
    sed -e’/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -ed       #多数sed
   解释:相当于是遇到指定的字符串就back了,然后执行下一行,那么只要是有
         相应字符串的行就不会被删除!
    gsed’/AAA\|BBB\|CCC/!d’                              # 对GNUsed有效
  
56.   显示包含“AAA”的段落 (段落间以空行分隔)
    HHsed v1.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’ -e d
    gsed’/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d’        # 只对GNU sed有效


57.   显示包含65个或以上字符的行
    sed -n -e’/^.\{65\}/’ ping.sh > 1
  
   显示包含65个以下字符的行
    sed -n -e’/^.\{65\}/!p’ ping.sh > 1
    or
    sed -e’/^.\{65\}/d’ ping.sh > 1

58.   显示部分文本——从包含正则表达式的行开始到最后一行结束
    sed -n -e’/XXX/, $ p’ ping.sh >1  
  
   显示部分文本——指定行号范围(从第8至第12行,含8和12行)
    sed -n -e’8,12 p’ ping.sh > 1
    sed =ping.sh | sed -e ‘{N;s/\n/  /}’ | sed -n -e ‘8,12p’   # 此处增加显示行号
  
   显示两个正则表达式之间的文本(包含)
    sed -n’/echo/,/judge/p’ >ping.sh      # 区分大小写方式
  
59.   显示第52行
    sed -n’52p’                    # 方法1
    sed’52!d’                      # 方法2
    sed’52q;d’                     # 方法3,处理大文件时更有效率  
  
  
60.   从第3行开始,每7行显示一次 
    gsed -n’3~7p’                  # 只对GNU sed有效
    sed -n’3,${p;n;n;n;n;n;n;}’    # 其他sed  
  
61.   删除文件中相邻的重复行(模拟“uniq”)
   只保留重复行中的第一行,其他行删除
    sed ‘$!N;/^\(.*\)\n\1$/!P;D’  
   解释:每次都要先与下一行进行比较,主要是理解中间一段指令的意思!
         就是从本行开始取串,以\n为分割标志!理论上就是唯一的一行!
         然后后面的\1$就是说,如果与此行相同,那么必然是\1后就是结尾了!
         那么就相当于是与上一行的重复,所以不打印!  D总是删除空间的
         第一行,所以执行到最后就OK 。。。

62.   删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存大小,
    或者使用GNUsed。
    sed -n ‘G;s/\n/&&/; /^\([ -~]*\n\).*\n\1/d;s/\n//; h;P’  
  
63.   删除除重复行外的所有行(模拟“uniq -d”)
    sed ‘$!N;s/^\(.*\)\n\1$/\1/; t; D’


64.   删除8的倍数行
    sed’n;n;n;n;n;n;n;n;d’ ping.sh > 1
    or
    GNU: gsed’0~8d’ ping,sh > 1
  
   但是要注意的是不是:
    sed’N;N;N;N;N;N;N;N;d’ ping,sh > 1
  
   主要是理解n和N的区别:
   n:   是将当前的焦点行设置为下一行,那么就是真正的移向下一行
   N:   是将下一行load到当前行!也就是说现在的两行是相当于一行的操作!
    if 是sed’N;N;N;N;N;N;N;N;d’ ping,sh >1操作,那么就是相当于是搜索到有8行
   就一起删除!if没有8行了剩下的就剩下了!!!所以特别注意哦~!!!
  
65.   删除文件中的所有空行(与“grep ‘.’ ”效果相同)
    sed’/^$/d’                             # 方法1
    sed’/./!d’                                 #方法2  
  
66.   只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。(模拟“cat -s”)
    sed’/./,/^$/!d’                #方法1,删除文件顶部的空行,允许尾部保留一空行
    sed’/^$/N;/\n$/D’           #方法2,允许顶部保留一空行,尾部不留空


    只保留多个相邻空行的前两行。
    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 3.02.*有效


    删除每个段落的最后一行
    sed -n ‘/^$/{p;h;};/./{x;/./p;}’
 
67.   一些优化:
    sed -e’/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d
    好消息是GNUsed能让命令更紧凑:
    sed’/AAA/b;/BBB/b;/CCC/b;d’     # 甚至可以写成
     sed’/AAA\|BBB\|CCC/b;d’
  
    速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高
    命令执行速度时,可以考虑在替换命令(“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      # 一样,但快得多  

赞(0) 打赏
转载请注明出处:服务器评测 » Linux sed 流编辑器的一些应用实例
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏