正则表达式sed学习(二)
sed
sed是一个流编辑器,非交互式的编辑器,它一次处理一行内容.
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)
接着用 sed 命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
sed 要用来自动编辑一个或多个文件;简化对文件的反复操作;编写装换程序等
sed 增加 修改 查找 删除 增删改查
#查
sed单行查询
sed多行查询(地址范围)
sed过滤功能
#增
sed单行增加
sed多行增加
sed增加案例
#删
sed删除功能及案例
#改
sed文本替换
sed变量替换
sed反向引用
sed替换案例
sed执行多条语句
获取文件行号
1.sed语法格式
sed [选项] [sed指令] [输入文件]
scripts:
地址定界编辑命令
常用选项:
-n 不输出模式空间中的内容至屏幕
-e 多点编辑
-r 支持扩展正则表达式
-i 直接编辑源文件
地址定界:
)空地址:对全文进行处理
)单地址
#:指定行
/pattern/:被此模式匹配到每一行
)地址范围
#.#
#,+#
#,/part1/
/part1/,/part2/
)步进:~
~:所有奇数行
~:所有偶数行
编辑命令:
p: 显示在模式空间的内容
d: 删除
a \text\:在行后面追加文本text,支持\n实现多行追加
i \text\:在行前面插入文本text,支持\n实现多行插入
c \text\:把匹配到的行替换为此处指定的文件中
w /path: 保存模式空间匹配到的行至指定的文件中
r /path:读取指定文件的内容至当前文件模式匹配到的行
=:为模式匹配到的行打印行号
!:条件取反
地址定界!编辑命令:
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等
替换标记
g:全局替换
w /path:将替换成功的结果保存至指定文件中
p:显示替换成功的行
2.sed命令执行流程
3.创建测试文件
cat >person.txt<<EOF
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
EOF
4.查询单行文本p 显示某一行
p sed指定,打印模式空间内容
-n sed选项,取消默认输出 [root@xiaoming ~]# sed '1p' person.txt
,oldboy,CEO
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO [root@xiaoming ~]# sed '1p' person.txt -n
,oldboy,CEO
#显示文件最后一行
[root@xiaoming ~]# sed '$p' person.txt -n
,feixue,CIO
5.查询连续多行文本,显示连续的多行,从哪里来到哪里去'1,4p'
指定p前面没有地址范围,那么默认匹配所有行
#数字地址范围--推荐 行号
#, 显示第二行到第四行的内容,包含第二行和第四行 [root@xiaoming ~]# sed '2,4p' person.txt -n
,zhangyao,CTO
,Alex,COO
,yy,CFO ##正则地址范围-模糊,容易找多了
[root@xiaoming ~]# sed -n '/oldboy/p' person.txt
,oldboy,CEO
[root@xiaoming ~]# sed -n '/o.*y/p' person.txt
,oldboy,CEO
[root@xiaoming ~]# sed -n '/o.*y/,/105/p' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO ##显示这个文件的第一行到第四行
[root@xiaoming ~]# sed -n '1,4p' person.txt ##从包含101的这一行,显示到包含104的这一行
[root@xiaoming ~]# sed -n '/101/,/104/p' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
sed查询功能对比grep
1.都是基于行为单位
2.都支持正则
3.sed可以做指定查询范围,grep不行
6.过滤多个字符串
-r sed选项,支持扩展正则表达式(|()) 默认情况,sed只支持基本正则表达式。
[root@xiaoming ~]# egrep 'oldboy|yy' person.txt
,oldboy,CEO
,yy,CFO [root@xiaoming ~]# sed -rn '/oldboy|yy/p' person.txt
,oldboy,CEO
,yy,CFO sed里面的正则字符左右必须有"/"。/oldboy/ 重点:
sed 查询单行文本
查询多行文本 使用数字地址范围sed '2,4p' person.txt -n
7.查询指定多行
使用分号
[root@xiaoming ~]# sed -n '1p;3p;5p' person.txt
,oldboy,CEO
,Alex,COO
,feixue,CIO
8.增加单行文本a,i
我想向person.txt文件中追加2行
,lidao,UFO
,bingbing,CEO
方法一:cat
cat >>person.txt <<EOF
,lidao,UFO
,bingbing,CEO
EOF 方法二:echo
[root@xiaoming ~]# echo "asda
> asdas
> asdas"
asda
asdas
asdas [root@xiaoming ~]# echo "106,lidao,UFO\n107,bingbing,CEO"
,lidao,UFO\n107,bingbing,CEO person.txt
[root@xiaoming ~]# echo -e "106,lidao,UFO\n107,bingbing,CEO"
,lidao,UFO
,bingbing,CEO person.txt
方法三:sed命令
#在第2行后面加入一个新行,内容为 oldboy.com
[root@xiaoming ~]# sed '2a oldboy.com' person.txt
,oldboy,CEO
,zhangyao,CTO
oldboy.com
,Alex,COO [root@xiaoming ~]# sed '2i oldboy.com' person.txt
,oldboy,CEO
oldboy.com
,zhangyao,CTO a append 追加
i insert 插入
#在最后一行后面追加2行内容
[root@xiaoming ~]# sed '$a 106,lidao,UFO\n107,bingbing,CEO' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
,lidao,UFO
,bingbing,CEO
9.删除文件内容d
d sed指令,删除文本内容
$ 代表文件最后一行 #删除第一行
[root@xiaoming ~]# sed '1d' person.txt
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
,lidao,UFO
,bingbing,CEO
#显示文件内容但不包含第一行
方法一:
[root@xiaoming ~]# grep -v 'oldboy' person.txt 方法二:
[root@xiaoming ~]# sed '/oldboy/d' person.txt 方法三:
[root@xiaoming ~]# awk '!/oldboy/' person.txt
10.修改文件内容c
禁用SELINUX
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "7c SELINU=disabledX" /etc/selinux/config
sed -i "/^SELINU=/ SELINU=disabledX" /etc/selinux/config
11.文本替换
's/old/new/g'
's@@@g'
's###g' s/\/etc/hosts/\/etc/hosts.bak/g
s#/etc/hosts#/etc/hosts.bak#/g [root@xiaoming ~]# cat person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO [root@xiaoming ~]# sed 's#[0-9]#oldboy#g' person.txt
oldboyoldboyoldboy,oldboy,CEO
oldboyoldboyoldboy,zhangyao,CTO
oldboyoldboyoldboy,Alex,COO
oldboyoldboyoldboy,yy,CFO
oldboyoldboyoldboy,feixue,CIO [root@xiaoming ~]# sed 's#[0-9]##g' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
//将第1-3行加注释
[root@xiaoming ~]# sed -i '1,3s@^@#@g' person.txt
[root@xiaoming ~]# cat person.txt
##oldboy01,oldboy,CEO
##oldboy02,zhangyao,CTO
##oldboy03,Alex,COO //将第1-3行注释移除
[root@xiaoming ~]# sed -i '1,3s@#@@g' person.txt
[root@xiaoming ~]# cat person.txt
oldboy01,oldboy,CEO
oldboy02,zhangyao,CTO
oldboy03,Alex,COO
反向引用
[root@xiaoming ~]# echo '101,abc' | egrep -o '[0-9]+' [root@xiaoming ~]# echo '101,abc' | sed -r 's#([0-9]+).*#\1#' [root@xiaoming ~]# echo '101,abc' | sed -r 's#(....)...#\1#'
,
[root@xiaoming ~]# echo '101,abc' | sed -r 's#(101),(abc)#\2\1#'
abc101
案例:将/etc/fstab里UUID开头的行另存到/tmp/fstab
方法一:使用grep
[root@xiaoming ~]# grep ^UUID /etc/fstab >/tmp/fstab
方法二:使用sed的编辑命令w
[root@xiaoming ~]# sed -n '/^UUID/w /tmp/fstab' /etc/fstab
案例:
[root@xiaoming ~]# sed -r 's#[0-9]+#room&#' person.txt
oldboyroom01,oldboy,CEO
oldboyroom02,zhangyao,CTO
oldboyroom03,Alex,COO
oldboyroom04,yy,CFO [root@xiaoming ~]# sed -r 's#[0-9]+#&room#' person.txt
oldboy01room,oldboy,CEO
oldboy02room,zhangyao,CTO
案例:在指定行后面读入其他文件内容
[root@xiaoming ~]# sed '/01/r /etc/hosts' person.txt
oldboy01,oldboy,CEO
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
:: localhost localhost.localdomain localhost6 localhost6.localdomain6
oldboy02,zhangyao,CTO
oldboy03,Alex,COO
案例:匹配打印行号
[root@xiaoming ~]# sed '/yy/=' person.txt
oldboy01,oldboy,CEO
oldboy02,zhangyao,CTO
oldboy03,Alex,COO oldboy04,yy,CFO
案例:取反
//打印出/etc/fstab非空非注释行
解法一:
[root@xiaoming ~]# egrep -v '^(#|$)' /etc/fstab
/dev/mapper/centos-root / xfs defaults
UUID=19ad14dc-26ff-4b14-86e7-c4e2182e820a /boot xfs defaults
/dev/mapper/centos-swap swap swap defaults
解法二:
[root@xiaoming ~]# sed -r '/^(#|$)/d' /etc/fstab
[root@xiaoming ~]# sed -nr '/^(#|$)/!p' /etc/fstab
/dev/mapper/centos-root / xfs defaults
UUID=19ad14dc-26ff-4b14-86e7-c4e2182e820a /boot xfs defaults
/dev/mapper/centos-swap swap swap defaults
注意:!的位置
案例:随机取出10位连续小写字符的字符串
openssl rand -base64 | sed 's#[^a-z]##g'| head -c
###-i 自动备份功能,先备份,在修改文件内容
[root@xiaoming ~]# sed -ri.bak 's#[0-9]#oldboy#' person.txt
[root@xiaoming ~]# ll
总用量
-rw-r--r-- root root 1月 : person.txt
-rw-r--r-- root root 1月 : person.txt.bak
获取centos7网卡IP地址
[root@xiaoming ~]# ifconfig ens33 | sed -nr 's#.*net (.*) netmask.*#\1#p'
10.0.1.31 [root@xiaoming ~]# ifconfig | awk 'NR==2{print $2}'
10.0.1.31
练习:
.通过正则取出绝对路径/var/log/messages的basename
提示:
[root@xiaoming ~]# basename /var/log/messages
messages
解法一:
[root@xiaoming ~]# echo '/var/log/messages' | egrep '[^/]+$' -o
messages
解法二:
[root@xiaoming ~]# echo '/var/log/mes1sages' | sed -r 's#/.*/##'
mes1sages
解法三:
[root@xiaoming ~]# echo '/var/log/mes1sages' | sed -r 's#.*/([^/]+$)#\1#'
mes1sages .通过正则取出绝对路劲/var/log/messages的dirname
提示:
[root@xiaoming ~]# dirname /var/log/messages
/var/log 解法一:
[root@xiaoming ~]# echo '/var/log/mes1sages' | egrep '^/.+/' -o
/var/log/
解法二:
[root@xiaoming ~]# echo '/var/log/mes1sages' | sed -r 's#[^/]+$##'
/var/log/
解法三:
[root@xiaoming ~]# echo '/var/log/mes1sages' | sed -r 's#(.*)/.*#\1#'
/var/log
正则表达式sed学习(二)的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
随机推荐
- python类(3)感悟
1.关于类属性attribute和实例(对象)特性property思考 为什么特性会出现,类属性不能完全替代它吗? 属性: python在为属性赋值时,只会搜索对象本身的__dict__,如果找不到对 ...
- html_位置偏移属性position
定位属性 位置属性position:static.relative.absolute.fixed 偏移属性:top.bottom.left.right 浮动定位属性:float/clear 1.浮动定 ...
- salt如何查看文档帮助
1.查看普通模块和函数使用方法 salt 'minion' sys.doc module_name salt ‘minion' sys.doc module_name.function_name ...
- 对自己有用的VS调试技巧
设置下一条语句 编辑然后继续 符号越界后查看堆对象 查看数组的值 底部 设置下一条语句 返回顶部 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了.当你发现一个函数调用的另一个函数返回错 ...
- Java编程知识点梳理
1. elementAt() temp.elementAt(0) 返回temp这个vector里面存放的第一个元素--->也是一个vector类型. 2. 字符串空格分割 String [] ...
- Spring原理系列一:Spring Bean的生命周期
一.前言 在日常开发中,spring极大地简化了我们日常的开发工作.spring为我们管理好bean, 我们拿来就用.但是我们不应该只停留在使用层面,深究spring内部的原理,才能在使用时融汇贯通. ...
- Redis 在NETCore中的应用
Redis 在NETCore中的应用 Redis 在netFramework中的应用 也一样 新建.NETCORE(webapi)项目 安装NuGet //查询NuGet语句 Find-Packag ...
- UVA 11404 简单LCS模型DP 字典序比较
这个题目求某个字符串中含的最长的回文子串. 就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗? 直接按LCS的套路来就 ...
- 实验吧web--易--后台登陆
题目地址:http://www.shiyanbar.com/ctf/2036 这道题确实有点考研脑洞了. 1.首先,查看网页源代码(Ctrl+U),会发现一段PHP代码: $sql = "S ...
- PAT Advanced 1086 Tree Traversals Again (25) [树的遍历]
题目 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For exam ...