zoukankan      html  css  js  c++  java
  • [转]sed常用命令总结

    转自:http://blog.chinaunix.net/uid-26963748-id-3249732.html

    一、Sed简介

    Sed:Stream Editor  流式编辑器 又称行编辑器,每次只编辑一行。Sed工作是在“模式空间”中进行的,并不操作源文件。对源文件无危害。

    二、Sed使用格式

        Sed命令的常用格式如下:

    (1)Sed [options] ‘script’ input_file…

    (2)Sed [options] –f script_file input_file…

    (3)Sed [options] ‘ADDR1,ADDR2command’ input_file…

    例如:#sed ’1,2d’ fstab 就可以将fstab的前两行删除并显示出来,但是它不会改变源文件。

    #Sed ‘1,2!d’ fstab 表示删除除第一行和第二行之外的所有行。

    (4)Sed [options] ‘/PATTERN/command’ input_file……

    &:s/l..e/&er/:表示引用前面匹配到的所有字符。

    例如:sed ‘/[[:upper:]]/d’ binary.sh 表示删除所有的大写字母的行。

    (5)Sed ‘/PATTERN1/,/PATTERN2/command’ input_file……

    说明:这表示从第一次被PATTERN1匹配到的行到第一次被PATTERN2匹配到的中间的所有行执行command命令。

    三、Sed的常用选项:

        -n:只显示sed匹配到的行。其余行不显示。下文有范例。

    -i :可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。

    -r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式

    -e:多脚本共用。可以同时执行多个命令。例如:

     [root@localhost ~]# sed -e 's@<h([[:alpha:]]*)>@H1@g' -e 's@(l..e).@1r.@g' test

    He love His lover.

    She like Her liker.

    Dove love Her liker.

    也可以这样用,中间用分号隔开:

    [root@localhost ~]# sed 's@<h([[:alpha:]]*)>@H1@g;s@(l..e).@1r.@g' test

    四、Sed的常用命令

    (1)P:模式空间中的文本在处理之前,每一次都会先显示一下;用p命令后再显示一下,即:匹配到的文本显示两次:例如:

     [root@localhost ~]# sed '1,2p' fstab

    /dev/vol0/root          /                       ext3    defaults                   1 1

    /dev/vol0/root          /                       ext3    defaults                   1 1

    /dev/vol0/home        /home               ext3    defaults                   1 2

    /dev/vol0/home        /home               ext3    defaults                   1 2

    LABEL=/boot         /boot                ext3    defaults                   1 2

    tmpfs                      /dev/shm           tmpfs   defaults                   0 0

    devpts                    /dev/pts             devpts  gid=5,mode=620   0 0

    sysfs                      /sys                      sysfs    defaults                 0 0

    proc                     /proc                   proc    defaults                   0 0

    LABEL=SWAP-sda3       swap       swap    defaults                 0 0

    我们可以看到第1,2行显示了两次。如果你只想显示用sed处理的行,则可在其前加-n选项。例如:sed  -n ‘1,2p’ fstab 其显示结果如下:

    root@localhost ~]# sed -n '1,2p' fstab

    /dev/vol0/root             /                        ext3    defaults        1 1

    /dev/vol0/home          /home                 ext3    defaults        1 2

    (2)a  :表示在模式匹配到的行后面添加新内容;

    i  :表示在模式匹配到的行前面添加新内容;

               /n:实现添加多行。如下例所示:

     [root@localhost ~]# sed '/#/a This is a comment line. It can be ignore.' test.sh

    #!/bin/bash

     This is a comment line.

    It can be ignore.

    #

     This is a comment line.

    It can be ignore.

    JUSER() {

        if id -u root &> /dev/null;then

           echo "Exists"

        else

           echo "No this user."

        fi

    }

    JUSER &> /dev/null

    echo $?

    这表示在#行的后面加上两行文字,如果将a换成i则表示在#行的前面添加文字。

    注意:sed '/#/!i This is a comment line. It can be ignore.' test.sh,如果在i前面加!表示对除了匹配到的行的其他行的前面添加以上两行。这样大家基本明白了a,i命令的使用方法了吧。

     (3)r FILE:表示读取某一个文件。例如:

    root@localhost ~]# sed '2r c.txt' c.sh  #表示在c.sh的第二行添加c.txt的内容。

    #!/bin/bash

    #

    This is my first lesson.

    Think you!

    line 1

    line 2

    line 3

     [root@localhost ~]# sed '/^#/r c.txt' c.sh  #表示在c.sh的#开头的行后面添加c.txt的内容。

    #!/bin/bash

    This is my first lesson.

    Think you!

    #

    This is my first lesson.

    Think you!

    line 1

    line 2

    line 3

    (4)w FILE: 可以将模式匹配到的行保存下来。例如:

    root@localhost ~]# cat c.sh     #显示c.sh中的内容

    #!/bin/bash

    #

    line 1

    line 2

    line 3

    [root@localhost ~]# sed -n '/^#/w cc.sh' c.sh  #将c.sh文件中以#开头的行保存在cc.sh中

    [root@localhost ~]# cat cc.sh                         #cc.sh的内容

    #!/bin/bash

    #

    (5)s:s/PATTERN/string/[g|i]   表示搜索符号PATTERN的内容,将其替换为string。

           g:表示将搜索到的内容全部替换。

           i:表示将搜索到的内容忽略大小写。

           如果PATTERN中含有与分隔符相同的字符时,可以将分隔符替换为其他符号。例如:s@PATTERN@string@[g|i]

    范例如下:

    [root@localhost ~]# cat test        #显示test的内容

    He love his love.

    She like her like.

    Dove love her like.

    [root@localhost ~]# sed 's@(l..e).@1r.@' test  #在最后一个单词后面加r,注意第.

    He love his lover.                                                #前面要加转义字符

    She like her liker.

    Dove love her liker.

    [root@localhost ~]# sed 's@<h([[:alpha:]]*)>@H1@g' test  #将以h开头的单词替换

    He love His love.                                       #为以H开头

    She like Her like.

    Dove love Her like.

    (6)n:以覆盖的方式读去下一行。

             N:以追加的方式读取下一行。例如:

    [root@localhost ~]# cat test          #test中的内容

    He love his love.

    She like her like.

    Dove love her like.

    four line

    [root@localhost ~]# sed -n 'n;p' test   #使用n时的效果

    She like her like.

    four line

    [root@localhost ~]# sed 'n;d' test     #只显示偶数行。

    He love his love.

    Dove love her like.

    [root@localhost ~]# sed -n 'N;p' test   #使用N时的效果

    He love his love.

    She like her like.

    Dove love her like.

    four line

    [root@localhost ~]# sed 'N;N;s@ @ @g' test  #表示将前三行合并为一行

    He love his love. She like her like. Dove love her like.

    four line

    [root@localhost ~]# sed '/.$/!N;s@ @ @g;s/bad animal/BAD ANIMAL/g' test 

    He love his love.

    She like her like.

    Dove love her like.

    four line Wendy is BAD ANIMAL.

    Blair is a BAD ANIMAL.

    这题目较复杂:(1)/.s/!N:表示先搜索不已点号结尾的行,(2)s@ @ @g:将搜索到的行去掉换行符 (3)将小写的bad animal 替换为BAD ANIMAL. 

    (7) h:将模式空间中的内容以覆盖的方式复制到保留空间。

               H:将模式空间中的内容以追加的方式复制到保留空间。

      g:将保留空间的内容以覆盖的方式复制到模式空间。

      G:将保留空间的内容以追加的方式复制到模式空间。例如:

    [root@localhost ~]# cat newfile             #显示文件中的内容

    line 1

    line 2

    line 3

    [root@localhost ~]# sed -n 'h;n;G;h;n;G;p' newfile  #将文件中的行倒序排列

    line 3

    line 2

    line 1

    (8)b:跳转,掠过符合条件的行。例如:

    [root@localhost ~]# sed '1b;y/123/456/' newfile

    line 1

    line 5

    line 6

    此例表示:跳过第一行,将其他各行的123替换为456;其中y表示替换的意思。

    b lable:表示跳转到某个位置。例如

    [root@localhost ~]# cat newfile

    line 1

    line

    line 3

    line

    [root@localhost ~]# sed '/.*[[:digit:]].*/b para;s/.*/% &/;:para;s/.*[0-9].*/# &/g' newfile

    # line 1

    % line

    # line 3

    % line

    此例表示,将带数字的行前添加#,不带数字前添加%;定义para为跳转符。这个参数可以随意指定。

    本文只是对sed的一些常用命令和选项做介绍,其余命令可查看帮助手册。谢谢!

  • 相关阅读:
    PHPUnit
    变长参数处理
    springMVC课程笔记(二)springMVC组件配置
    URL编码以及GET和POST提交乱码解决方案
    springMVC课程笔记(一)springMVC架构原理分析
    ELK(ElasticSearch, Logstash, Kibana) 实现 Java 分布式系统日志分析架构
    Java 标准 IO 流编程一览笔录( 下 )
    Java 标准 IO 流编程一览笔录( 上 )
    Zookeeper系列(十四)Zookeeper的数据与存储
    Zookeeper系列(十三)Zookeeper的请求处理
  • 原文地址:https://www.cnblogs.com/Andy-Lv/p/5315232.html
Copyright © 2011-2022 走看看