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     
   ----> 就是 & 符号处理

相关推荐