命令行工具:sed流式编辑

sed

简介

sed表示stream editor,流式编辑,把文件按行读进来,做处理。做替换处理text replacement ,或者删除操作的时候特别有用。

基本的命令模式sed [options] commands [file-to-edit]

其中commands是传给sed的命令,也是最核心的;

commands的模式为[addr]X[options],其中addr指定是对哪些行做操作,比如第1行,或者3-100行,也可以通过正则表达式确定;其中X是一个字符的sed命令,常见的有p打印,d删除,s替换等;[options]表示不同命令所需要的参数,比如替换操作时g表示全局替换;

[file-to-edit]是需要处理的文件,当然sed也可以接受stdin作为输入。

Cookbook

sed涉及的参数太多了,直接用一个个case比较好解释。

打印行的操作:

sed默认会对匹配到的行做echo操作,所以默认是有print操作的,可以用参数-n抑制默认的打印操作,一般-np放在一起使用。

  • sed '' filename:和cat一个效果;
  • sed -n '1p' filename:打印第一行;
  • sed -n '10,20p' filename:打印10-20行;
  • sed -n '10,+10p' filename:打印从第10行开始的10行,注意有的版本的sed不支持;

删除行的操作:

  • sed '1d' filename:删除第一行,当我们不需要CSV的header时候很实用;
  • sed -i '1d' filename:删除文件第一行,in-place模式,也就是直接修改文件,比较危险;
  • sed -i.bak '1d' filename:删除文件第一行,in-place模式,但会先创建一个filename.bak文件;
  • sed '2,10d' filename:删除第2-10行,2,10指定一个区间range;
  • sed /^$/d filename:删除空行,这里是用正则表达式锁定操作的区间的,也就是匹配到空行才执行操作;
  • sed /^foo/d filename:删除以foo开头的行;
  • sed /ERROR/!d filename:删除包含ERROR的行,其中!作用是negate the range,对不包含在指定range里的行操作;

替换行的操作:

s表示substitute,也是sed最强大的命令。基本模式就是sed 's/regex/replacement/' filename,其中s表示替换,注意/需要三个,一个都不能少哦,也可以用其他字符统一替换,比如:sed 's:regex:replacement:' filename同样有效;s前面也可以指定range,限定要替换的范围,不指定的话对所有行操作。

  • sed 's/this/This/' filename:把this替换为This,只替换第一个匹配的this;
  • sed 's/this/This/g' filename:global模式,把所有的this替换为This;
  • sed 's/this/This/2 filename:替换第二个this为This;注意这里指的是当前行匹配到的第二个this;

echo "thisthisthis" | sed 's/this/This/2'会输出thisThisthis

  • sed -n 's/this/This/2p' filename:会打印发生替换的行;
  • sed 's/this/This/i filename':查找的时候忽略大小写;
  • sed -e 's/this/This/' -e 's/that/That/' filename:整合多条sed命令;

Reference

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

ElasticSearch里面一些小坑笔记

3414
来自专栏大内老A

.NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置。值得推荐的做法就是采用《.NET Cor...

17610
来自专栏Echo is learning

字符、字符集、编码,以及它们python中会遇到的一些问题(下)

1305
来自专栏JetpropelledSnake

Python入门之Python引用模块和查找模块路径

#这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力。对于“模...

3149
来自专栏开源优测

21条自动化测试过程中遭遇的问题及解决思路

1、找不到元素,脚本报“NoSuchElementException:Unable to find element”,或者"定位到了,不能操作,点击无效"

841
来自专栏IT探索

java学习笔记

712
来自专栏Python

python——模块和包 需要注意的地方

一 模块 1.import import module:   将执行文件(module)的目录路径插入到sys.path的第一个位置 执行时:   1.创建新...

18410
来自专栏猿人谷

unix共享内存要点

共享内存优点:     1.在进程之间不通过内核传递数据,即不通过系统调用拷贝数据,达到快速,高效的数据传输。     2.随内核持续     *nix的共享内...

16910
来自专栏性能与架构

Javascript promise 模式是什么?

什么promise模式 先看一个场景 ? A 中执行了ajax请求,在回调函数中调用了B,B 中又是一个ajax请求 这种代码方式会有问题 (1)可读性太...

2487
来自专栏移动开发面面观

Python中的正则表达式

1105

扫码关注云+社区