Linux文本三剑客之sed仗剑走天涯
一,sed是什么?
sed是Strem Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。对文件内容逐行(行编辑器,一行读取一次,对行编辑)进行处理调用操作并显示到STDOUT,常用功能有增删改查,过滤,取行。
二,sed的工作流程
(1)sed默认不编辑原文件,而是逐行操作处理,把当前处理的行存储在临时缓存空间,称为“模式空间”(pattern space)。
(2)接着在pattern space内进行模式匹配,即和指定条件做匹配
不满足模式:输出到标准输出STDOUT;
满足模式:进行指定的模式操作,再输出到STDOUT;
(3)第二个特殊的缓存空间——“保持空间”:hold space,临时保存操作在另一处缓存空间;
(4)当执行pattern space和 hold space里相关选项的时候来回进行之间的数据流编辑操作;
(5)最后根据操作执行hold space空间操作,选择性显示到STDOUT;
三,sed的语法格式
sed [OPTION]... 'script' [input-file] ...
注意:1.sed和后面的选项之间至少有一个空格。
2.script:指的是AddressCommands(地址定界编辑命令),AddressCommands中间无空格,直接连接为一个选项操作
3.input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。
四,sed的常用选项和地址定界
(1)OPTION常用选项:
-n:不输出模式空间中的内容至屏幕; -e script, --expression=script:多点编辑; -f /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令; -r, --regexp-extended:支持使用扩展正则表达式; -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;(编辑操作的结果直接保存在原文件中)
(2)地址定界:
①空地址:什么都不写时,表示对全文进行处理;
②单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;注意:【/ /】是固定模式符号,不能省略
③地址范围:(#表示任意数字)
#,#:从某行到某行,第二个#大于第一个#
#,+#:从某行开始到加多少行(3,+8 :第3行向下开始一共8行,包含第三行)
#,/pattern1/:(从指定的行开始到第一次被模式所匹配的行结束的所有行)
/pattern1/,/pattern2/:从第一次匹配到的模式1到第二次匹配到的模式2
$:最后一行;
④步进:~,#~# 从第几行
1~2:所有奇数行。 从第一行开始,每次加两行读取
2~2:所有偶数行。 从第二行开始,每次加两行读取
五,sed编辑命令
(1)常用编辑命令:
d:删除;
~]# sed '1d' FILE #删除第一行 ~]# sed '2,$d' FILE #删除第二行到最后一行
p:列印;显示模式空间中的内容,但默认会输出2次匹配的结果,因此使用-n取消默认输出;
~]# sed -n '1p' FILE #显示第一行 ~]# sed -n '2,$p' FILE #显示第二行到最后一行
a \text:新增;在行后面追加文本“text”,支持使用\n实现多行追加;
~]# sed '/^test/a\this is' FILE #将 this is 追加到以test开头的行后面 ~]# sed '2a\this is\nis this' FILE #将 this is 和 is this 多行追加第二行后面
i \text:插入;在行前面插入文本“text”,支持使用\n实现多行插入;
~]# sed -i '5i\this is' FILE #在文件第5行之前插入this is ~]# sed -i '5i\this is\nis this' FILE #将 this is 和 is this 多行插入第5行之前
c \text:按行替换;把匹配到的行替换为此处指定的文本“text”;
~]# sed '2c\this is' FILE #将文件第二行替换为this is
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
~]# sed -n '/test/w file' example #在example中所有包含test的行都被写入file里
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
~]# sed '2r file' filename #将file的内容读进来显示在filename文件第二行后面
=:为模式匹配到的行打印行号;
~]# sed '/this is/=' FILE #显示 this is 的行号
!:条件取反;
地址定界!编辑命令;
~]# sed '1!d' FILE #除了第一行全部删除
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
~]# sed 's/book/books/' FILE #把每一行中第一处 book 替换成 books
替换标记:
g:全局替换;
~]# sed 's/book/books/g' FILE #把每一行中的所有 book 替换成 books ~]# sed 's/book/books/3g' FILE #从每一行的第三处开始替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
~]# sed 's/book/books/3gp' FILE #显示替换成功的行
练习:
1.删除text9文件中所有以空白字符开头的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' text9
2.删除text9文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' text9
3.输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@' ~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
(2)高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
P:打印多行匹配空间的第一行。
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
实例:
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行
六,实战案例
1.变量替换
2.分组替换\( \)和\1的用法:
\( \)
的功能可以记住正则表达式的一部分,其中,\1
为第一个记住的模式即第一个小括号中的匹配内容,\2
第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。
①^.*am–>这句的意思是以任意字符开头到am为止,匹配文件中的I am字符串;
②\([a-z].*\)–>这句的外壳就是括号\(\),[a-z].*合起来就是匹配任意多个字符,因为ood字符串是我们需要的,因此用括号括起来匹配,后面通过\1来取good字符串;
③ b.*$–>表示以空格b起始,任意字符结尾,实际就是匹配good字符串后,紧接着的字符串 boy.;
④sed默认识别基本正则表达式,sed加上-r选项则可以使用扩展正则表达式。
3.特殊符号 & 代表被替换的内容
将text9前三行中 b 改成 --b--
~]# sed '1,3s#b#--&--#g' text9
4.打印奇偶行
打印奇数行:
~]# sed -n '1~2p' text9 ~]# sed -n 'p;n' text9
打印偶数行:
~]# sed -n 'n;p' text9 ~]# sed -n '2~2p' text9
5.获取本机IP地址
~]# ifconfig | sed -n '2p' | sed 's/^.*inet//g' | sed 's/netmask.*$//g'
6.将text9中偶数行末尾替换成 --w ;
sed '2~2s#$#--w#' text9 sed 'n;s#$#--w#' text9 sed '1~2!s#$#--w#' text9
转载于:https://blog.51cto.com/wqiang/1753180
Linux文本三剑客之sed仗剑走天涯相关推荐
- Geek爱旅行 - 仗剑走天涯
记得刚毕业的时候,也就是2004年,那时的我还在郑州,一个月三千,过了试用期转正又涨了两千,特别开心.虽然路不好走,每天要处理的问题都是自己不会的,但是慢慢习惯了这种生活带来的压力,由于小地方的坑比较 ...
- nutch学习、、孤剑之家 宝剑锋从磨砺出,梅花香自苦寒来。我欲仗剑走天涯。 博客园 首页 新随笔 联系 订阅订阅 管理 随笔 - 771 文章 - 8 评论 - 13
孤剑之家 宝剑锋从磨砺出,梅花香自苦寒来.我欲仗剑Nutch 2.2+MySQL+Solr4.2实现网站内容的抓取和索引 原文地址: http://blog.sina.com.cn/s/blog_3c ...
- Linux文本三剑客之sed
sed命令详解 一.简介 二.工作原理 三.用法 1.地址定界 2.编辑命令 四.实例及详解 一.简介 sed是一种新型的,非交互式的流式(从上往下读取一行处理一行)的编辑器 可以执行vi和ex相同的 ...
- 三年已投 1000 亿打造的达摩院,何以仗剑走天涯?
[CSDN 编者按]带着"必须要比阿里巴巴活的时间长"的愿景,达摩院进入"三岁而立"之年.据报道,阿里巴巴旗下研究机构达摩院首次公布了三年来的成绩单,成绩十分亮 ...
- 三年投 1000 亿,达摩院何以仗剑走天涯?
作者 | Carol 责编 | 张 文 头图 | 下载于视觉中国 出品 | CSDN(ID:CSDNnews) [CSDN 编者按]带着"必须要比阿里巴巴活的时间长"的愿景,达 ...
- 2020-04-13起码仗剑走天涯
讲个小故事,自有一腔热血少年气,一心想去看看世界的繁华,出门的时候,剑还未配妥,骑着马就走上了江湖,可是你在路上遇到一个人,她在后面抱着你,她说要许你终生,发现,剑是破剑,马是跛马,天涯呢?远在天边, ...
- 曾梦想仗剑走天涯,看世界的繁华
"如果过去的就让他过去了,未来的只会更糟糕"'.本文就是基于这样一个想法而写的.用来审视过去的10年. 高中过后,就没怎么写过文章.大学时期多是写写作业和实验报告,但那些东西只是为 ...
- Solomon Hykes离开Docker公司,自此仗剑走天涯
Solomon Hykes的成功之路一直崎岖而坎坷.他的Docker创立旅程,始于10年前在巴黎建立的dotCloud,并以今天提出的辞职请求作结.期间,Hykes领导dotCloud由一家PaaS公 ...
- OSChina 周一乱弹 —— 曾梦想仗剑走天涯,后来bug多没去
2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2019)请戳(这里) [今日歌曲] @宇辰OSC :分享Rag'N'Bone Man的单曲<Skin& ...
最新文章
- [Medical Image Processing] 1. Introduction
- Windows下Core Audio APIs的使用简介
- 网页按钮跳转位置_阻止safari从网页跳转至app
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面
- 不要打2岁内和6岁后的孩子 父母必看
- php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL
- 前端常用60余种工具方法(下)
- hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系
- 如何在Android中使用Intent拨打电话?
- linux xp双系统引导修复工具,XP和ubuntu双系统下如何修复XP引导菜单
- iOS导入自定义字体
- Idea导入jar包的两种方法
- 产品流程图的制作方法详解
- retrofit应用详解与源码解析--源码解析
- java Outlook的日程_使用Outlook进行日程安排的方法
- springboot DataSource
- 一年级上册知识点——语文(人教版)
- 破解携程中文验证码爬取机票价格数据
- 基于Dense-U-net的3D粒子场全息重建
- 《Python股票量化交易从入门到实践》随书赠送“回测框架”的使用帮助