文本处理三剑客之sed详细用法--实例

本文详细介绍了sed命令在文本处理中的应用,包括删除、查找、替换、字符转换、插入文本、打印、读入文本等多种操作。通过实例展示了如何删除特定行、替换指定内容、插入文本以及处理空行等常见任务,是学习sed命令的实用教程。
摘要由CSDN通过智能技术生成

sed

常用参数

        -e 多条件编辑

        -r 支持扩展正则表达式-

        n 只显示匹配出的行

        -f 指定sed脚本

        -i 直接修改源文件

        = 显示文件行号

行号范围

        x        x为行号

        x,y        表示行号从x到y

        /pattern        查询包含模式的行

        /pattern /pattern        查询包含两个模式的行

        pattern/,x        在给定行号上查询包含模式的行

        x,/pattern/        通过行号和模式查询匹配的行

        x,y!        查询不包含指定行号x和y的行

举例说明

        (test.txt为测试文件)

       查找

                1.打印出文件中第二行,默认会全部输出,加-n只打印匹配行,!为取反

                sed '2p' test.txt 

                sed -n '2p' test.txt 

                sed -n '2!p' test.txt         (除了2行)

                2.打印1-3行

                sed -n  '1,3p' test.txt 

                3.将文件的第一行删除后输出到屏幕

                sed '1d' test.txt 

                4.sed默认不修改原文件,如果想修改原文件得加-i

                sed -i '1d' test.txt

       删除

                1.删除指定范围的行(第1行到第3行)

                sed '1,3d' test.txt

                2.删除第3行到下两行之间的内容

                sed '3,+2d' test.txt 

                3.删除第3行到最后行的内容

                sed '3,$d' test.txt 

                4.删除最后一行的内容

                sed '$d' test.txt 

                5.跨奇数行删除

                sed '1~2d' test.txt 

                6.跨偶数行删除

                sed '2~2d' test.txt 

                7.从第3行开始跨偶数行删除

                sed '3~2d' test.txt 

                8.删除包含"name"的行

                sed '/name/d' test.txt

                9.删除包含"name"到最后的行

                sed '/name/,$d' test.txt 

                10.删除包含"name"到下俩行的行

                sed '/name/,+2d' test.txt

                11.删除空行

                sed '/^$/d' test.txt

       查找替换

                (使用s命令将查找到的文本替换为新的文本,默认情况只替换第一次匹配到的内容)

                1.将line替换为大写的LINE

                sed 's/line/LINE/' test.txt 

                2.如果想只替换第二个匹配到的line为LINE

                sed 's/line/LINE/2' test.txt 

                3.使用g选项,可以完成所有匹配值的替换

                sed 's/line/LINE/g' test.txt

                4.将以this开头的this替换为that

                sed 's/^this/that/' test.txt

                5.将符合"," 换成"-" 

                sed -n 's/,/-/gp' test.txt

                6.如果删除每一行的第一个字符应该怎么做?

                sed 's/^.//g' test.txt

                7.在匹配到name的行,将行首第一个字母替换为*

                sed '/name/s/^./*/' test.txt

       字符转换 

                (使用y命令可以进行字符转换,其作用为将一系列字符逐个地变换为另外一系列字符)

                1.将ABCD转换为1234

                sed 'y/ABCD/1234/' test.txt

       插入文本 

                (使用i或a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入)

                1.使用i在第二行前插入文本

                sed '2 i Insert' test.txt

                2.使用a在第二行后插入文本

                sed '2 a append' test.txt

                3.在匹配的上一行插入文本

                sed '/Second/i\Insert' test.txt

                4.如果要同时新增多行,则每行之间要用反斜杠\n来进行新行的添加

                sed '2 a\append1\nappend2\nappend3' test.txt

                5.在匹配到how的句子后面添加一句:I'm fine.

                sed "/how/s/$/ I'm fine/" test.txt

                6.如何添加双引号呢

                sed '/how/aI"m fine.' test.txt

       取代行 

                (c命令,c的后面可以接字符串,这些字符串可以取代n1,n2之间的行)

                sed '2,4c this is 2-4 line' test.txt 

       读入文本

                (使用r命令可从其他文件中读取文本,并插入匹配行之后)

                1.将/etc/passwd中的内容读出放到test.txt空行之后

                sed '/^$/r /etc/passwd' test.txt

       打印 

                (使用p命令进行打印,使用sed命令时一般都加-n参数,表示不打印没关系的行)

                (不加-n参数,会输出所有行,找到的行会重复显示)

                1.只打印匹配到the的这行

                sed -n '/the/p' test.txt

                2.当用到sed不同的编辑命令时,可以用{ },不同的编辑命令之间用分号隔开

                sed -n "/the/{=;p}" test.txt

                3.打印前5行

                sed '5q' test.txt 

                4.打印出匹配first的行到第4行

                sed -n '/First/,4p' test.txt

                5.打印出不包含line的行

                sed -n '/line/!p' test.txt 

                6.将全文的this改成THAT,并删除所有空行

                sed 's/this/that/g; /^$/d' test.txt

       总结

                sed 默认不对原文件执行操作,如果想生效,则使用-i

                而且默认全部打印输出,如果想只打印匹配到的行,用p,前面加上-n 参数

                删除:d,定点删除,从哪里到哪里删除,删除开头,结尾等。

                跨奇数、偶数删除、包括单词的行删除

                查找替换: s///,s@@@,s###,s&&&,等符号,都可以使用。

                字符转换:y/// 但注意的是,新的字符必须和旧的字符长度相同,否则无法使用。

                插入文本: i insert: 匹配行前边, a append: 匹配行后边。

                添加多行,注意使用\n 换行符。

                取代行:选择到 几行到几行之后, 然后用c 后面就可以用一句话代替

                \u : 就是表示把第一个字符转化成大写字母。

                uppercase\l : 表示小写

                & : 就是表示匹配前面正则表达式的那部分

                \b : 匹配一个单词边界,也就是指单词和空格间的位置

       练习题

                1.删除/etc/grub2.cfg文件中所有以空白开头的行,思考如果向要删除这些空白字符应该怎么做?

                sed '/^[[:space:]]/d' /etc/grub2.cfg        方法一

                sed 's/^[[:space:]]//g' /etc/grub2.cfg        方法二

                2.删除/etc/fstab文件中所有以#开头

                sed '/^#/d' /etc/fstab 

                3.将/etc/fstab中全部添加#号键,并以#号开头

                sed 's/^/\#/g' /etc/fstab

                4.删除/etc/passwd中的偶数行

                sed '2~2d' /etc/passwd

                5.从/etc/passwd中找出包含root的行,并把root改成rooter

                sed 's/root/rooter/g' /etc/passwd

                sed -n 's/root/rooter/gp' /etc/passwd

                6.从/etc/passwd中找到以为bash结尾并在这些行后面加上一句话:you are very good!

                sed '/bash$/a you are very good!' /etc/passwd

                7.删除/etc/passwd中头三行信息

                sed '1,3d' /etc/passwd

                sed -n '4,$p' /etc/passwd

                8.只打印/etc/passwd中第5到第10行信息

                sed -n '5,10p' /etc/passwd

                9.删除/etc/passwd中,包含'ftp‘的行到包好'ntp'的行

                sed '/ftp/,/ntp/d' /etc/passwd

                10.删除所有包含nologin的行

                sed '/nologin/d' /etc/passwd

                11.将所有的bin,改成sbin

                sed 's/bin/sbin/g' /etc/passwd

                12.用how are you 取代包含usr的行

                sed -n '/usr/c how are you' /etc/passwd

                13.把包含数字的换成*号代替

                sed 's/[[:digit:]]/*/g' /etc/passwd

                14.把包含sync的行,到包含sshd的行 全部用 Come on 代替!

                sed '/sync/,/sshd/c Come on' /etc/passwd

                15.把每个单词的第一个小写字母变大写。

                sed 's/\<[a-z]/\u&/' /etc/passwd

                16.匹配以字母a开头的行尾位加上一句话:To be NO.1

                sed -r 's/(^a.*)/\1 To be NO.1/' /etc/passwd

                17.找出包含nobody的行,打印出,并只打印匹配的内容

                sed -n '/nobody/{p;=}' /etc/passwd

                18.只打印从包含gnome到最后 的行

                sed -n '/gnome/,$p' /etc/passwd

                19.同时打印以mail开头的行和以rpm开头的行

                sed -n -e '/^mail/p' -e '/^rpc/p' 

                20.从第5行开始到结束把:符号换成*符号

                sed '5,$s/:/*/g' /etc/passwd

                21.打印出前10行

                sed '10q' /etc/passwd

                22.从/etc/fstab文件中,打印出不包含##的行

                sed -n '/#/!p' /etc/fstab 

                23.将第8行,到匹配到行首为gdm的行首第一次字母替换为*

                sed '8,/gdm/s/^./*/g' /etc/passwd

                24.在匹配以sshd开头的行后面添加两行内容,分别为:are you ok? yes, I'm fine

                sed '/sshd/a are you ok?\nyes,I'\''m fine!' /etc/passwd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自然醒o./

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值