15 July 2014

sed 用来对文本进行过滤和替换操作,sed 可以通过一次兑取一行内容来对某些指令进行处理后输出,所以sed适合处理大数据文件。sed 默认不会直接修改源文件,而是将读入的内容复制到缓冲区中,这个缓存区被称之为“模式空间”,所有的指令操作都是在模式空间进行的,sed 默认输出至标准输入(屏幕上)。

sed 基本语法

sed 从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理。脚本指令是第一个非”-“开头的参数,格式如下:

格式:sed [选项] {脚本命令} [输入文件]

选项:

* --version         #显示sed的版本。
* -n,--silent      #静默输出,该选项可以屏蔽自动打印到屏幕上。
* -e script         #允许多个脚本指令被执行。
* -f script-file    #从文件中读取脚本指令。
* -i                #直接修改源文件。
* --posix           #禁用GNU sed扩展功能。
* -r                #在脚本指令中使用扩展正则表达式。
* -u                #最低限度的缓存输入与输出。

sed 入门范例

脚本的基本格式

格式:

address{
    command1
    command2
    command3
    ……
}

tips: 第一个命令可以跟左花括号在同一行,但是右花括号必须单独处一行。此外,命令后添加空格也会产生错误。

常用指令:

    a   追加 
    s   替换
    i   插入
    d   删除
    c   更改
    y   按字符替换
    p   打印
    w   保存
    r   读入文件内容
    q   退出

demo1 :

sed '2a this is a demo' test.txt        #在test文件的第二行追加文字。
sed '3i hello ' test.txt                #在test文件的第三行插入文字。
sed 's/yes/no/g' test.txt               #将文本中所有的yes替换成no。
sed '3,4d' test.txt                     #删除第3,4行的内容。

tip1.在实际工作中,大多数情况你并不确定操作对象(地址)的行号,更多的是用正则表达式确定操作对象(地址)。

demo2:

sed '/^$/d' test.txt    #删除 文件中的空白行

tip2.我们也可以将命令写入到脚本文件,通过-f参数读取脚本文件。

demo3:

源文件test.html为:
    <div>
        <p>this is a demo page!</p>
        h1helloh1
        h2helloh2
        h3helloh3
    </div>

脚本sed.sh内容为:
/h[0-9]/{
s//\<&\>/1      
s//\<\/&\>/2    
}

执行:
sed -f sed.sh test.html 

结果:
    <div>
        <p>this is a demo page!</p>
        <h1>hello</h1>
        <h2>hello</h2>
        <h3>hello</h3>
    </div>

ps :虽然sed可以利用” -e “参数一次执行多个命令,但是在实际工作中都是把多个命令放在脚本中,这样也便于修改。

tip3.操作对象(地址)的匹配范围。

每次在编写脚本的时候都需要指定一个地址来决定操作范围,如果不指定,默认对文件的所有行进行操作。有如下方式来确定操作范围:

number      指定具体的行号  如:sed '3d' test.txt
first~step  以first开始,并指定操作步长为step。 如:sed '1~2p' test.txt 打印奇数行
/regexp/    /……/中间是正则表达式。
\mregexpm   \m与m 之间匹配正则表达式,m字符可以是任意字符替代。
num1,num2   指定行号范围。  如:sed '3,9d' test.txt 删除3~9行
num1,+N     匹配mun1以及后面的n行。