文本三剑客之sed编辑器(中)

简介: 文本三剑客:都是按行读取后处理。grep 过滤行内容。awk 过滤字段。sed 过滤行内容;修改行内容。


示例2:

通过字符串匹配出想要的行。

[root@yuji ~]# sed '/e$/d' ff.txt    //删除以e结尾的行
 two
 four
 six
 seven
 eight
 ten
 [root@yuji ~]# sed '/e$/!d' ff.txt   //除了以e结尾的行,其他行都删除
 one
 three
 five
 nine
复制代码


网络异常,图片无法展示
|


示例3:

'/字符串1/,/字符串2/d' :从第一个匹配的位置打开删除功能,到第二个匹配的位置删完后关闭删除功能。之后继续按这个规则向下查找删除。

[root@yuji ~]# cat 2.txt
 111
 222
 333
 444
 555
 111
 222
 333
 444
 555
 [root@yuji ~]# sed '/2/,/4/d' 2.txt  
 111
 555
 111
 555
 [root@yuji ~]# sed '/1/,/3/d' 2.txt
 444
 555
 444
 555
复制代码


网络异常,图片无法展示
|


示例4:

删除空行并保存:sed -i '/^$/d' file.txt (使用-i前先备份目标文件)

[root@yuji ~]# cat file.txt
 11
 22
 33
 [root@yuji ~]# sed -i '/^$/d' file.txt
 [root@yuji ~]# cat file.txt
 11
 22
 33
复制代码


网络异常,图片无法展示
|



小贴士:

删除空行的三种方法:

  1. grep -v "^$" file.txt //过滤出非空行
  2. cat file.txt |tr -s "\n" //压缩换行符
  3. sed '/^$/d' file.txt //删除空行


6 sed 修改替换s c y


s:替换字符串

c:整行替换

y:字符替换,替换前后的字符串长度必须相同

6.1 替换字符串 s

格式:

行范围 s/旧字符串/新字符串/替换标记
 #4种替换标记:
 数字:表明新字符串将替换第几处匹配的地方
 g:表面新字符串将会替换所有匹配的地方
 p:打印与替换命令匹配的行,与-n一起使用
 w 文件:将替换的结果写入文件中
复制代码


示例1:

[root@yuji ~]# sed -n '/root/p' pass.txt        //打印所有包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@yuji ~]# sed -n 's/root/aaa/p' pass.txt       //将匹配行的第1个root替换成aaa
aaa:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/aaa:/sbin/nologin
[root@yuji ~]# sed -n 's/root/aaa/2p' pass.txt      //将匹配行的第2个root替换成aaa
root:x:0:0:aaa:/root:/bin/bash
[root@yuji ~]# sed -n 's/root/aaa/3p' pass.txt      //将匹配行的第3个root替换成aaa
root:x:0:0:root:/aaa:/bin/bash
[root@yuji ~]# sed -n 's/root/aaa/gp' pass.txt      //将匹配行的所有root替换成aaa
aaa:x:0:0:aaa:/aaa:/bin/bash
operator:x:11:0:operator:/aaa:/sbin/nologin
复制代码


网络异常,图片无法展示
|


示例2:

[root@yuji ~]# sed -n 's/root//gp' pass.txt      //删除匹配行当所有root
 :x:0:0::/:/bin/bash
 operator:x:11:0:operator:/:/sbin/nologin
 [root@yuji ~]# echo 000010101 | sed 's/^0*//'    //删除开头所有的0
 10101
复制代码


网络异常,图片无法展示
|


示例3:

将root开头的行进行注释(在开头加上#);

在包含root的行的行尾加上#

[root@yuji ~]# sed -n '/^root/p' pass.txt     //打印所有以root开头的行
 root:x:0:0:root:/root:/bin/bash
 [root@yuji ~]# sed -n '/^root/ s/^/#/p' pass.txt     //过滤出以root开头的行,在行首加上#
 #root:x:0:0:root:/root:/bin/bash
 [root@yuji ~]# sed -n '/root/p' pass.txt            //打印包含root的行
 root:x:0:0:root:/root:/bin/bash
 operator:x:11:0:operator:/root:/sbin/nologin
 [root@yuji ~]# sed -n '/root/ s/$/#/p' pass.txt     //在包含root的行的行尾加上#
 root:x:0:0:root:/root:/bin/bash#
 operator:x:11:0:operator:/root:/sbin/nologin#
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


示例4:另一种替换方式

将包含root内容的行进行注释:

用正则表达式匹配包含root的整行内容,之后在整行内容前加#。&代表前面使用正则表达式匹配到的整行内容。

[root@yuji ~]# sed -n '/root/ s/^/#/p' pass.txt     //过滤出包含root的行,在行首加上#
 #root:x:0:0:root:/root:/bin/bash
 #operator:x:11:0:operator:/root:/sbin/nologin
 [root@yuji ~]# sed -n 's/.*root.*/#&/p' pass.txt
 #root:x:0:0:root:/root:/bin/bash
 #operator:x:11:0:operator:/root:/sbin/nologin
复制代码


网络异常,图片无法展示
|


示例5:-f 指定脚本文件来执行

可以在文件中定义多条操作规则。

[root@yuji ~]# vim 1.sh
 [root@yuji ~]# cat 1.sh
 /root/ s/^/#/p
 3,5 s/$/#/p
 [root@yuji ~]# sed -n -f 1.sh pass.txt       //指定1.sh文件来执行
 #root:x:0:0:root:/root:/bin/bash
 daemon:x:2:2:daemon:/sbin:/sbin/nologin#
 adm:x:3:4:adm:/var/adm:/sbin/nologin#
 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin#
 #operator:x:11:0:operator:/root:/sbin/nologin
复制代码


网络异常,图片无法展示
|


示例6:将修改后的内容保存到另一个文件中

1)重定向全文本(将修改后的行内容和原文其他内容一起保存)

[root@yuji ~]# cat ff.txt
 one
 two
 three
 four
 five
 six
 seven
 eight
 nine
 ten
 [root@yuji ~]# sed '1,5 s/^/#/' ff.txt >out1.txt    //重定向全文本
 [root@yuji ~]# cat out1.txt
 #one
 #two
 #three
 #four
 #five
 six
 seven
 eight
 nine
 ten
复制代码


网络异常,图片无法展示
|


2)只重定向修改的内容(两种方法)

#方法一,重定向
 [root@yuji ~]# sed -n '1,5 s/^/#/p' ff.txt >out2.txt
 [root@yuji ~]# cat out2.txt
 #one
 #two
 #three
 #four
 #five
 #方法二,使用w
 [root@yuji ~]# sed -n '1,5 s/^/#/w out3.txt' ff.txt
 [root@yuji ~]# cat out3.txt
 #one
 #two
 #three
 #four
 #five
复制代码


网络异常,图片无法展示
|


示例7:指定分隔符

当字符串中包含"/"时,需要在前面加上转义符\,避免和分隔符"/"混淆。这样操作非常麻烦,且容易眼花看错,此时可以自己指定分隔符。

s后面的第一个字符就是分隔符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符需要使用 \ 转义成普通字符。

#默认分隔符为"/"
 [root@yuji ~]# sed -n 's//bin/bash//sbin/nologin/p' pass.txt
 root:x:0:0:root:/root:/sbin/nologin
 yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin
 nancy:x:1021:1021::/home/nancy:/sbin/nologin
 helen:x:1022:1022::/home/helen:/sbin/nologin
 #指定#作为分割符
 [root@yuji ~]# sed -n 's#/bin/bash#/sbin/nologin#p' pass.txt
 root:x:0:0:root:/root:/sbin/nologin
 yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin
 nancy:x:1021:1021::/home/nancy:/sbin/nologin
 helen:x:1022:1022::/home/helen:/sbin/nologin
 #指定!作为分隔符
 [root@yuji ~]# sed -n 's!/bin/bash!/sbin/nologin!p' pass.txt
 root:x:0:0:root:/root:/sbin/nologin
 yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin
 nancy:x:1021:1021::/home/nancy:/sbin/nologin
 helen:x:1022:1022::/home/helen:/sbin/nologin
 #指定8作为分隔符
 [root@yuji ~]# sed -n 's8/bin/bash8/sbin/nologin8p' pass.txt
 root:x:0:0:root:/root:/sbin/nologin
 yuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologin
 nancy:x:1021:1021::/home/nancy:/sbin/nologin
 helen:x:1022:1022::/home/helen:/sbin/nologin
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


思考:

sed 's9\945\99\98\939g' test.txt  //这行命令的作用是什么?
 相当于s/94599/9893/g,指定了9作分隔符,那么普通的数字9前面要加\。即将94599替换成9893。
复制代码


网络异常,图片无法展示
|


6.2 整行替换 c

使用c进行替换,是对整行内容进行替换。

示例:

将包含字符串fo的行,整体替换成22。

[root@yuji ~]# cat ff.txt
 one
 two
 three
 four
 five
 six
 seven
 eight
 nine
 ten
 [root@yuji ~]# sed '/fo/c 22' ff.txt    //将包含fo的行,整体替换成22
 one
 two
 three
 22
 five
 six
 seven
 eight
 nine
 ten
复制代码


网络异常,图片无法展示
|

相关文章
|
3月前
|
数据采集 运维 监控
运维笔记:流编辑器sed命令用法解析
运维笔记:流编辑器sed命令用法解析
59 5
|
5月前
|
开发工具
Vim 编辑器:高效文本编辑的瑞士军刀
**Vim 概览:** Vim 是一个功能丰富的文本编辑器,以其高度可定制性著称。文章介绍了 Vim 的高效使用技巧,包括快捷打开文件、命令行模式下的常用命令、查找与替换、删除和复制文本。还讨论了配置 `.vimrc` 文件以自定义设置,如改变 leader 键、设置缩进和高亮,并展示了安装插件如 vim-airline 和 vim-snazzy 的方法。通过这些技巧,用户能提升 Vim 使用效率。
68 5
|
4月前
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
|
4月前
|
JavaScript
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
文本---富文本编辑器------Vue3使用富文本编辑器,Quill,全局样式和组件和样式的写法
文本---富文本编辑器------Vue3使用富文本编辑器,Quill,全局样式和组件和样式的写法
|
存储 Perl
sed编辑器
sed编辑器
72 0
|
缓存 BI Linux
《Linux操作系统编程》第九章 数据查找和筛选工具 : 了解流编辑器sed和报表生成器awk的简单使用
《Linux操作系统编程》第九章 数据查找和筛选工具 : 了解流编辑器sed和报表生成器awk的简单使用
85 0
|
存储 Shell Perl
shell编程之sed编辑器
shell编程之sed编辑器
73 0
|
Linux 开发工具 开发者
掌握文本编辑的艺术:深入了解Linux中的Vim编辑器
在Linux系统中,文本编辑是一项常见的任务。为了满足不同层次的用户需求,诞生了许多文本编辑器,其中Vim作为一个强大的编辑器,广受开发者和系统管理员的喜爱。本文将深入介绍Vim的基本概念、特点以及如何在Linux系统中使用它进行高效的文本编辑。
133 0
|
Linux Perl
【Linux进阶命令 03】sed (文本的流编辑器)
【Linux进阶命令 03】sed (文本的流编辑器)