sed - 流编辑器

sed:
    流编辑器逐行处理文件(或输入),并将结果发送到屏幕. 


语法:
        sed [-nefr] [[n1[,n2]]动作] 


说明: sed首先把当前正在处理的行保存在一个模式空间中,然后处理模式空间中 \
     的行,完成后就把该行发送到屏幕上。sed每处理完一行就将其从模式空间  \
     中删除,然后将下一行读入,进行处理和显示。直至处理完输入文件的最   \
     后一行后. 所以sed命令默认不会修改原文件. 


参数说明: 
        -i : 直接修改读取文件的内容, 而不是从屏幕输出


        -n : 安静模式, 只能经过sed特殊处理的那一行(或者动作)才会被列出来.


        -f : 将sed的动作写在一个文件内, -f filename则进行filename内的sed \
             动作. 即在处理输入时, 将file中指定的命令添加到运行的命令中


        -e : 直接在指令列模式上进行sed的动作编辑; 在处理输入时, 将script \
            中指定的命令添加到运行的命令中


        -r : sed的动作支援的是延伸型正规表示法的语法


n1,n2代表的是地址, 它可以是数字、正则表达式或者二者的结合。


[n1[,n2]]function:
a   : 后面可接字符串, 这些字符串新增在指定行后面一行 
c   : 后面可接字符串, 这些字符串可以替换n1,n2之间的行
d   : 删除n1,n2之间的行
i   : 后面可接字符串, 这些字符串新增在指定行的前一行
p   : 将指定的n1,n2打印出来
r   : 将一个独立文件中的数据插入到数据流中 
q   : 退出sed
s   : n1,n2s/old/new/flags, 在n1至n2之间用new替换old的字符串
      flags的选项:
            1> 数字, 表明新文本将替换第几处模式匹配的地方
            2> g, 表明新文本将会替换所有已有文本出现的地方
            3> p, 表明替换后的行要打印出来
            4> w file, 将替换原来行的结果写到文件中


示例:
删除:
cat -n /etc/passwd | head -n 25 | sed '2,5d'
    显示/etc/passwd的前25行, 然后删除第2至第5行.
sed '$d' if.sh
    删除if.sh的最后一行


添加:
cat -n /etc/passwd | head -n 20 | sed '2a csflxy'
    在第2行后添加一行: csflxy; 2a改成2i就是在第2行前面添加一行:csflxy;


    如果要添加的不止一行, 可用\来表示分行.如:
nl /etc/passwd | sed '2a Drink tea or .... \
        drink beer ?'
        
sed '2,3a csflxy' data2
    在data2的第二行和第三行前插入csflxy    


替换:
cat -n /etc/passwd | head -n20 | sed '2,5c No 2-5 number'
    把2-5行的字符串替换成No 2-5 number


打印特定行:
nl /etc/passwd | sed -n '5,7p'
    打印出第5至第7的行.


/sbin/ifconfig eth0 | grep 'inet addr'  \
| sed 's/^.*addr://g'                    \
| sed 's/Bcast:.*$//g'
    打印出IP地址


sed '/^$/d' regular_express.txt
    删除空白行


cat /etc/manpath.config | grep 'MAN' | \
sed 's/#.*$//g' | sed '/^$/d'
    提取非#开头的, 带有MAN的行, 且删除空白行


sed -i 's/\.$/\!/g' regular_express.txt
    把regular_express内每一行结尾的.替换成!


sed -i '$a # This is a test' regular_express.txt
    $代表是最后一行, 而a的动作是新增, 因此该文件最新增一行.


sed -e 's/brown/green/g; s/dog/cat/g' regular_express.txt
    使用-e参数, 使用多个处理命令


第一步: 先创建一个script1.sed文件, 里面含有sed编辑命令
第二步: sed -f script1.sed regular_express.txt


sed -n 's/brown/green/w data2' data1
    表示将data1的brown字符串替换成green, 然后存储到data2中


数据的搜寻与操作[打印, 删除等]
nl /etc/passwd | sed '/root/d'
    删除含有root的行
nl /etc/passwd | sed -n '/root/p'
    打印含有root的行, 且只打印符合条件的; 如果不加参数-n
    则nl打印出来的记录再加上sed选中含有root的行.
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
    搜寻含有root的行, 并把bash替换成blueshell, 最后把其打印出来.


多点编辑:
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
    删除/etc/passwd第三行到未尾的行, 然后把bash替换成blueshell.


直接修改文件内容:
sed -i 's/\.$/\!/g' regular_express.txt
sed -i '$a # This is a test' regular_express.txt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值