命令行工具: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 条评论
登录 后参与评论

相关文章

来自专栏智能合约

Phalcon入门教程之Volt模板引擎

1283
来自专栏Linyb极客之路

从Java内存模型角度理解安全初始化

如大家所知,Java代码在编译和运行的过程中会对代码有很多意想不到且不受开发人员控制的操作:

843
来自专栏大闲人柴毛毛

Java并发编程的艺术(十二)——线程安全

1. 什么是『线程安全』? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。 2. ...

3645
来自专栏java一日一条

ava多线程:volatile变量、happens-before关系及内存一致性

请参考来自 Jean-philippe Bempel 的评论。他提到了一个真实因 JVM 优化导致死锁的例子。我尽可能多地写博客的原因之一是一旦自己理解错了,可...

662
来自专栏Java技术

Java多线程编程-(5)-线程间通信机制的介绍与使用(温馨提示:图文较多,建议Wiff下打开)

我们知道线程是操作系统中独立的个体,但是这个单独的个体之间没有一种特殊的处理方式使之成为一个整体,线程之间没有任何交流和沟通的话,他就是一个个单独的个体,不足以...

1213
来自专栏CodingToDie

Python学习(七):模块 优雅的封装

第7 章 模块 优雅的封装 Table of Contents Python中的模块 使用模块 定义模块 建议 模块的安装 模块搜索路径 作用域 编程是一种美德...

6774
来自专栏流柯技术学院

JMeter专题系列(五)检查点

检查点:我们对用户名和密码进行了参数化,那么怎样来判断jmeter有没有正确调用t.dat里面的文件呢。当然,我们可以从结果图表中查看。但我还是想在“登录”这个...

863
来自专栏Android 研究

Android系统启动——3init.rc解析

init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(ac...

2842
来自专栏Ryan Miao

java基础题目总结

有些基础题目由于工作中用的比较少但却又是不可少的,这样回答起来就会反应慢,不确定,不准确,特此开了文章记录遇到的不确定或者回答比较拗口的问题。 1.servle...

3469
来自专栏CSDN技术头条

一图读懂JVM架构解析

本文阐述了JVM的构成和组件,配图清晰易懂,是学习Java开发者的入门必读文章。 每个Java开发人员都知道字节码经由JRE(Java运行时环境)执行。但他们或...

2088

扫码关注云+社区