【Linux】文本处理三剑客之sed

目录

一、Linux文本处理三剑客之sed

1、基本概念

2、工作原理

3、sed 命令的基本格式

4、常用选项

5、地址定界

6、编辑命令

7、举例

        sed也可以使用正则表达式


一、Linux文本处理三剑客之sed

1、基本概念

        sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交与式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。

2、工作原理

        sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结 束运行。 sed 把每一行都存在模式空间中,对这个副本进行编辑,所以不会修改或破坏原文件。


        简单来说,sed编辑器是先读取一行到模式空间,再按规则匹配处理,并将结果输出到屏幕上;如果读取的这一行没有做处理也输出到屏幕上,再读取下一行;所以不会修改或破坏原文件。


  • sed是一种非交互式的流式编辑器,这里有两个关键字,非交互式和流式;
  • 非交互式就是指sed只能够在命令行下输入编辑命令来对文本进行编辑,然后在屏幕上查看输出;
  • 流式是指sed每次只从文件中读入一行,然后对该行进行指定的处理,并将处理结果输出到屏幕上,处理完后再读入下一行 。

3、sed 命令的基本格式

[root@localhost ~]# sed [选项] [编辑命令] 文件名

4、常用选项

选项含义
-e 脚本命令该选项会将其后跟的脚本命令添加到已有的命令中。

-f<script文件>

--file=<script文件>

以选项中指定的script文件来处理输入的文本文件。
-n默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
-i此选项会直接修改源文件,要慎用。
-r支持使用扩展正则表达式

5、地址定界

        地址定界,是sed是否执行命令的条件。



(1) 空地址:对全文进行处理;


(2) 单地址:
        #   指定行;
        /pattern/   被此模式所匹配到的每一行;


(3) 地址范围
        #,#   从第#行到第#行
        #,+#   从#行开始,再加#行
        #,/pat1/   从#行开始,一直到匹配到的内容
        /pat1/,/pat2/   两个匹配到的内容之间
        $  在表示范围的时候表示最后一行;在替换里表示行的终止。


(4) 步进:~
        1~2:所有奇数行
        2~2:所有偶数行

        波浪号~也可以指定地址范围。它指定每次要跳过的行数。如 n~m 表示从第 n 行开始,每次跳过 (m-1) 行:
1~2 匹配 1,3,5,7......
2~2 匹配 2,4,6,8.,.....
1~3 匹配 1,4,7,10,.....
2~3 匹配 2,5,8,11,.....

6、编辑命令

  • d    删除;
  • p    打印模式空间中的内容(会出现两遍,sed命令本来就会输出模式空间内容,使用p                                                                                                            命令又会打印一遍)
  • n    命令 n 打印当前模式空间的内容(只会输出一遍)
  • a \text   在行后面追加文本“text”,支持使用\n实现多行追加;
  • i \text    在行前面插入文本“text”,支持使用\n实现多行插入;
  • c \text   把匹配到的行替换为此处指定的文本“text”;
  • w /PATH/TO/SOMEFILE       保存模式空间匹配到的行至指定的文件中;
  • l  打印不可见字符
  • y  命令 y 根据对应位置转换字符。好处之一便是把大写字符转换为小写,反之亦然。
  • q  退出 sed
  • r /PATH/FROM/SOMEFILE   读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
  • =  为模式匹配到的行打印行号;
  • !   条件取反;
  • s/north/123/g  查找替换,其分隔符可自行指定,常用的有s@@@, s###等;     
    • 替换标记:
      • g   全局替换;
      • w /PATH/TO/SOMEFILE  将替换成功的结果保存至指定文件中;
      • p  显示替换成功的行;
      • num 表示替换第几次出现的
      • (比如/2 会替换每行中第 2 次出现的a为A)
      • i   忽略大小写
      • e

  • 在使用正则表达式时有一个特殊的符号 & 表示连接的意思

7、举例

# vi sed.file

northwest       NW      Charles Main    4.0     .99     3       35
western         WE      Sharon Gray     8.3     .97     5       23
southwest       SW      Lewis Dalsass   4.7     .8      2       19
southern        SO      Suan Chin       5.1     .96     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       16
eastern         EA      TB Savage       7.7     .84     5       22
northeast       NE      AM Main Jr.     5.1     .96     3       13
north           NO      Margot Weber    3.4     .87     5       8
central         CT      Ann Stephens    2.7     .94     5       14
# sed "/north/p" sed.file
(匹配有north的每一行怕、并打印出来)

         明明只打印匹配的行,为什么全都出来了?还有重复的?

         sed是先读取一行,再按规则匹配处理,并将结果输出到屏幕上,再读取下一行;如果读取的这一行没有做任何处理也是输出到屏幕上,再读取下一行;所以会出现整个文件内容和符合匹配规则的行;


        如果不想要没处理的行呢?

# sed -n "/north/p" sed.file


        删除了模式空间的每一行,再发送出来,所以是空的;         

        但是查看原文件还在,所以说sed不会删除和修改源文件;


        删除模式空间高亮那一行;


        替换

再范围内替换

# sed "/101/,/107/s/Manager/Dr/p" employee.txt


        sed也可以使用正则表达式

        替换以west开头的为123;


将只有两个数字的都连接0.1


分组和引用

第一个分组是Mar 第二个分组是t  所以在替换的时候引用了第一个Mar 和第二个分组t;

# sed "s/\(Mar\)go\(t\)/\1AB\2/p" sed.file


        从哪一行到哪一行

# sed  "/northwest/,/eastern/p" sed.file

# sed "1,5p" sed.file


         从第三行开始,再加三行 ;

# sed  "3,+3p" sed.file

        从第三行到最后一行

# sed "3,$ p" sed.file


        范围内的替换

# sed "/northwest/,/southern/s/north/@@@/" sed.file


$的使用

        在范围里表示最后一行;

# sed  "3,$ p" sed.file

        在替换里表示行的终止

# sed "s/$/111/" sed.file


        匹配 north 到 south 之间的将行尾替换成@@ ;但因为下面只有 north 匹配不到 south 所以从这一行开始的每一行行尾都一换成了@@;

        简单来说,从 north 开始就将每一行的行尾都替换成@@,直到匹配到south才会停止;


 多点编辑

        多点编辑就是可以连续执行多个命令;

# sed -e '2,3d' -e '/north/,/south/s/$/@@/' sed.file


 a \text   在行后面追加文本“text”,支持使用\n实现多行追加;

# sed "/^north/a------" sed.file

# sed '2 a 203,Jack Johnson,Engineer' employee.txt
(在第二行后面追加一行)

i \text    在行前面插入文本“text”,支持使用\n实现多行插入;

# sed "/^north/i------" sed.file


c \text   把匹配到的行替换为此处指定的文本“text”;

# sed "/^north/c------" sed.file


        =  为模式匹配到的行打印行号;行号表示这一行在第几行


w /PATH/TO/SOMEFILE       保存模式空间匹配到的行至指定的文件中;

sed "匹配范围 w 保存的文件名" 原文件名
# sed "/north/ w /root/2" sed.file

     注意!!在保存不同的内容到相同的文件中时,会先清空文件再保存进去;


        r /PATH/FROM/SOMEFILE   读取指定文件的内容至当前文件被模式匹配到的行后面;
# sed "/north/ r /root/2" sed.file

        只要匹配到 north 就在后面加入 /root/2 的内容


替换时忽略大小写


y转义字符
# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' employee.txt
(所有小写字母转换成大写字母)

操作多个文件
$ sed -n '/root/ p' /etc/passwd /etc/group

(同时在/etc/passwd 和/etc/group 中搜索 root)


$ sed '3 q' employee.txt

(打印第 5 行后退出,即只打印前 5 行:)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LKsTaRt~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值