Linux命令学习计划【sed】
引言:
Sed命令是linux里用于文本行处理的命令。
为了便于说明,我在/usr/dict下创建了字典words并以此作为演示模板
先用nl 打印下words内容:

*打印篇:
Q1:如何打印某一行数据?
如果要打印第一行数据,则使用:
sed –n 1p words
如果要打印最后一行数据,则使用:
sed –n ‘$p’ words
注意的是:如果是某个具体的行号,并不需要加引号,如果含’$’等特殊字符或某些模式匹配的时候需要加引号。
你会想,仅仅是能看到头行和结尾行的数据,有什么稀奇的?试想如果一个文本,比如一个‘庞大’的log,仅仅是要看第10000行的数据,怎么去看?如果一页页去找会很麻烦,同时打开很大的文件去查找也是不现实的。这时用sed命令就非常方便。看!
sed -n 10000p words
Q2:打印连续的行?
打印连续行只要这么写:
sed –n 2,6p words
表示打印2-6行的数据
打印从第5行道结尾的数据,这么写:
sed –n ‘5,$p’ words
Q2:怎样打印不连续的行?
比如我想只打印第5、8、10数据:

这里用到了“-e”参数,每个-e 后面都可以表达式+执行动作,sed按顺序执行。
Q3:打印包含指定字符(模式匹配)的行?
当我们在一个庞大的文档中查找数据时,往往不知道要查找的东西在哪行,我们知道的可能是某行数据包含什么字符串或者符合什么样的规律,这时要用到模式匹配,把要匹配的格式放在两个’/’之间,如下:
/pattern-text/
。比如要查看含’abc’的行:
sed –n /abc/p words
要查看包含3个连续相同字符的行:
sed –n ‘/\(\w\)\1\1/p’ words

Q4:打印行号?
sed命令可以打印匹配行的行号:
sed –n /aaa/= words,”p”换成”=”,表示打印行号。
*新增篇
Q1:在某一行后添加新行要怎么做?
比如sedtest下有三个脚本:

写这些脚本的人都是一个作者,作者写完后发现有必要在源码中留下自己的大名。于是他这样做:
sed –in ‘1a #author is elvis’ sh01.sh sh02.sh sh03.sh
加上-i表示修改的内容直接‘写回’文档而不在屏幕输出
1a表示在第一行后插入新行,这是因为第一行往往是’#!’行。也可以把1a换为2i,表示在第二行前插入一行(当然默认了一个脚本文件至少有2行)

加上大名后作者还不满意,想一次性地把版本和日期信息加上并且加上一行注释‘This is for test’。sed也能一次性地添加多行,可以直接在后面添加换行符\n,也可以通过在shell中输入【\+回车】分开每行的输入:

除此之外,sed还可以读取一个文本文件的内容并追加到指定行的后面:
比如要在3个脚本文件末尾追加sh04.sh的内容:
sed –in ‘$r sh04.sh’ sh01.sh sh02.sh sh03.sh
sh04.sh中写了很多内容,包括定义了一些方法,比如sh04.sh中定义了bomb方法。通过上面的命令就可以把这个方法插入了3个脚本的末尾。

*删除篇
利用sed命令可以轻松删除文本文件中指定的行。
用法是:sed n1,n2d textfilepath;或sed ‘/pattern-text/d’ textfilepath
比如:我想查看一个shell脚本,但是不想看注释,同时不打印空行,可以这么做;

细心的你可能会发现我少加了”-n”参数,在打印和新增的时候通常要加上”-n”参数,因为”-n“表示是只输出匹配的行。
我们改写上面的案例,看下打印如果不加这项参数会怎样。

咦?怎么还是把所有的打印出来了?而且还重复打印了!
这是因为原始行在非安静模式下是会输出,显示不符合我们想要的结果。加上”-n”就”安静“多了!

由于删除的动作,是显示删除后原始行的数据,所以不需要加”-n“,如果加了将看不到任何效果。

*修改篇
sed命令可以修改一个文本文档的数据。
1、 整行取代
sed n1,n2c textfilepath

比如我要把words中的空行用三个’#’代替,可以这么做:

2、 局部修改
正则表达式是个利器,它成就了像sed,awk这样的强大的文本工具。sed可以通过匹配修改一个文本文档中任何你想修改的地方,比如:
words中每一行单词首字母都不是大写,通过sed命令就可以完善这一点,看!

比如,我想把words中每个全数字的单词都加上”0x“前缀:

*番外篇
1、小结:
通过上面的介绍,总结sed的用法规律,
sed [–nrfe] + 正则表达式或行号+执行动作 + 文件,执行动作用a,c,i这类的字符标识。
同时sed也是一个管道命令,所谓管道(pipe)命令,简单的理解是不仅可以产生数据,也可以接收和处理别的命令产生的数据。
比如一个文档中有很多重复行,用sed定位行时没必要把所有的重复行打印出来,这时可以先用uniq命令去除重复行,然后把去除重复后的数据交给sed处理:

2、扩展:
-e、-f、-r参数的含义和使用
有些人对sed中nrfe这4个参数不理解,其实理解它们不难,手册+实践就搞定。
-n上面已经说明了,这里略过。
先用man sed看下参数的说明:

可以看到-e和-f的作用都是一样,都是向命令行添加执行动作,只不过-e是直接在后面添加表达式,-f是指定一个脚本文件。
在打印篇已经看到了-e的用法,对!一条sed命令可以连续接好几个-e exp的,它告诉我们一条sed命令其实做很多事情。
比如修改篇中,我想同时实现转换大写字母和添加前缀的功能,就可以用-e参数实现:

-f的作用就是指定一个写满执行动作的文件:
比如我写了一个sed_print文件,里面写了我要打印某几行的命令:

我只要在sed命令后指定这个文档就可以打印第2行、第5行、第8行的数据,是不是很方便

-r的作用是应用扩展的正则表达式
如果不加这个参数默认使用的基本的正则表达式,这样有些语法是无法使用的,比如”+“和”?”。看看下面这个对比就知道了:
比如words不是按行分隔,而是按空格分隔,我想使其中的每个英文单词的首字母大写:


上面的正则表达式用到了“+“,所以必须加”-r“参数才可,否则就匹配不了,这也是我们在用sed命令时要十分小心的地方。
扩展的正则表达式到底扩展了哪些东西呢?
除了上面讲的+和?外还有:
1、{m,n}字符次数匹配
2、|,OR匹配

3、(),分组和反向引用

Linux命令学习计划【sed】的更多相关文章
- Linux命令学习-sed
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- 《Linux命令学习手册》系列分享专栏
<Linux命令学习手册>系列分享专栏 <Linux命令学习手册>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/207 ...
- Linux命令学习笔记目录
Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...
- 别出心裁的Linux命令学习法
别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...
- Linux命令学习
Linux命令学习 Ubuntu常用快捷键 •Ctrl+Alt+T: 打开终端 •Ctrl+Shift+T: 新建标签页 •Tab: 终端中命令补全 •Alt+数字N: 终端中切换到第N个标签页 •↑ ...
- Linux命令学习总结之rmdir命令的相关资料可以参考下
这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...
- linux命令学习之:chmod
chmod命令用来变更文件或目录的权限.在Linux系统家族里,文件或目录权限的控制分别以读取R.写入W.执行X3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录 ...
- Linux命令学习笔记1
1.Linux命令学习 2.Mkdir /data -创建文件夹 在/下创建文件夹 data 3.Cd -目录切换 列如cd / 4.Touch /data/1 ...
- 20155229付钰涵-虚拟机安装及LINUX命令学习
安装Ubuntu遇到的问题 问题一: 新建虚拟电脑的版本只有32-bit,与老师所给教程中的64-bit不符.为此我上百度搜寻了答案. 第一种方法: 控制面板--程序与功能--启动或关闭windows ...
随机推荐
- socket编程:客户端与服务器间的连接以及各函数的用法
在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法.这样:我们在写一些简单的socket编程时就 ...
- bzoj3123
首先肯定是主席树但这是一类“动态树”,似乎没有什么好的办法那就暴力呗,这里用到启发式合并,即两棵树合并,重建节点少的的那棵可以用并查集维护连通性查询主席树的建立还是和bzoj2588一样 ; type ...
- Light OJ 1017 - Brush (III)
题目大意: 在一个二维平面上有N个点,散落在这个平面上.现在要清理这些点.有一个刷子刷子的宽度是w. 刷子上连着一根绳子,刷子可以水平的移动(在X轴方向上).他可以把刷子放在任何一个地方然后开 ...
- 字符串(后缀数组||SAM):NOI2015 品酒大会
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAByIAAALuCAIAAABtq0bwAAAgAElEQVR4nOy9f2wb150vev4boESeln ...
- 图论:(Code Forces) Graph and String
Graph and String time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Java---获得系统窗口的分辨率
//获得系统屏幕分辨率 //得到当前屏幕的分辨率:Toolkit.getDafaultToolkit().getScreenSize() Toolkit t = Toolkit.getDefaultT ...
- A Mini Locomotive(动态规划 01)
/* 题意:选出3个连续的 数的个数 为K的区间,使他们的和最大 分析: dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]); dp[j][i]:从 ...
- SRM 600(1-250pt,500pt)
DIV1 250pt 题意:给定一个vector<int>A,若能从里面选出一些数,使得他们按位或的值为x,则称x为吉利数.给定k,问最少要从A里面去掉多少个数,才能使k变为不吉利数. 解 ...
- linux 下安装配置jboss as7以及部署应用
linux 下安装配置jboss as7以及部署应用 1.测试平台及软件 centos 5.4 jdk-7u5-linux-i586.rpm jboss-as-7.1.1.Final.zip jbos ...
- uva:10340 - All in All(字符串匹配)
题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每一个字符和s中的字符匹配.注意这里 ...