前言/谝闲传部分
说明
:想要快速了解命令的用法 及其记忆技巧的朋友,请跳过此部分内容,直接查看正文或末尾总结即可!
大家都知道,和Linux这哥们打交道呢 主要是熟练掌握各种命令及命令搭配不同参数的使用,掌握这些命令可以帮助我们解决实际问题的同时极大的提高工作效率。这就好比一门语言,你若想要跟别人良好的交流就必须学习掌握这门语言,而且在学习过程中你可能还会领悟到它的其他方面的魅力,这将吸引你更大的兴趣进一步深入研究下去。
对应到Linux系统,我们为什么要学习那些乱七八糟的命令呢?因为Linux系统它不像Windows系统那样提供直白的图形化操作界面,相比于windows系统下操作是借助鼠标biangbiangbiang点击触发实现,Linux系统的操作实现显得就更为简洁、抽象、优雅,显得更具有逼格上档次,因为Linux系统只为我们提供一个简洁的终端界面,所有(对硬件的)操作都通过Linux操作系统提供的这个交互终端来实现。比如你想要在Linux环境下操作某个文件、创建一个目录等等,只需在终端中合适位置输入相应命令回车即可,就这么简单快速高效。想想当别人还在鼠标右键准备创建一个文件的时候你已经哐哐哐的输完命令创建成功,是不是效率快上不少啊! 当然了,和知识一样Linux的学习过程是一个循序渐进和反复练习的过程,只有不断修炼和钻研,才能不断积累和提高。
Linux服务器端开发很常见的一个操作就是文件处理,相信对于很多刚接触Linux的朋友来说,处理文件一般都是通过vim或vi命令来编辑修改、通过cat命令/工具进行查看,稍微高级一点的可能通过head、tail等命令配合参数来查看。其实,不管是知识还是技能当我们进阶/修炼到一定程度的时候,我们就要思变,想想有没有其他更强大、便捷、高级的实现方法?聊到这儿相信大家肯定知道答案是有的,没错!
好了,废话不多讲,下面正式开始谝闲传,嗷不,是正式呈上本文的重点:文本处理神器sed命令
。请收好,轻装上车,快乐出发!
一、sed命令介绍及其处理文件的原理:
sed,其全称为:Stream EDitor,见名即知意,顾名思义是一种用于文本处理的流式编辑器。它的工作原理或者说思路就是:将文本文件以(输入)流的形式逐行读取
到一个缓冲区,然后根据指定的编辑命令/参数对其进行修改或转换等系列处理,然后将结果输出到标准输出或者通过命令参数直接输出到原文件。(核心重点:面向行处理的工具,以“行”为处理单位对每一行进行处理,处理后的结果会输出到标准输出)
一般情况下我们处理文本文件时,会根据需求选用不同的命令,来达到查看、编辑等目的,而本文介绍的大咖----sed命令,它的强大将会让你感叹不已,何以故?因为通过sed这一个命令,你就可以实现文本文件的:增、删、改、查,而且它丰富的参数可以助你实现灵活多样的增、删、改、查。 同时,值得注意的是:sed 命令是一个很懂礼貌的命令,它不会直接对源文件做任何贸然的修改(除非加上-i参数),而是将内容都输出到标准输出中。sed被贵封为Linux三剑客之一,足以说明它的强大与魅力!
。(关于三剑客中的其他二圣我将会单独的书写文章详细来谈),到这里大家是不是已经迫不及待的想见识它的威力呢?
插曲 :单纯对于sed命令的介绍,网上有so many的教程和讲解,但细心的你会发现他们大多是干巴巴的知识,对于命令和各参数的使用 都是勇敢直接、赤裸裸的呈现。好处是够直接,一眼就瞅到具体用法,但缺点也显而易见:不能很好的记忆。即使是当下记住了,一段时间不用照样是三连忘,只有将它的各个命令参数的由来、使用场景、结果呈现等方面进行全面透彻的理解,才能彻底掌握并记住。这就是我书写本文的意图与意义!
.
二、sed命令用法详细介绍:
1、sed命令使用格式:
sed 参数 '脚本参数/选项' 被处理文件 //例如:sed -e '2a' test1.txt
2、sed命令-参数介绍:
sed命令后面可以跟的参数主要有5个(不常用的参数此处省略,如需要请自行补充),具体如下:
-e : 直接在命令行模式下进行文件编辑处理,即 处理操作不影响源文件,可以通过配合后面的
脚本选项展示处理结果或将处理结果输出到单独的文件。
-n : 使用静默模式。默认情况下,被操作文件的数据一般都会被打印到屏幕上,
但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被打印出来。
-f : 将处理文本文件的系列sed操作写在一个脚本文件内,如execute.sh,
然后使用 sed -f execute.sh '脚本选项' 被处理文件,则可以执行脚本文件内的多个sed操作。
-r : 使用扩展正则表达式的语法
-i : 直接修改原文件内容,而不是输出到屏幕上(直接修改被处理的源文件)
注意:
· · ·sed命令后面可以出现上述命令中的任意一个,也可以多个同时出现;
· · ·多个同时出现时,可以连写(如sed -ie),也可以分开单独写(如sed -i -e -f),但对于sed命令最好各参数分开单独写,可以防止出现不想要的结果哦~;
3、sed命令-脚本参数/选项介绍:
sed命令之所以强大到可以对被操作文件进行增、删、改、查等处理,是因为它提供了非常多的处理选项供我们灵活使用。根据操作类型具体分为如下:
新增操作:
i : i即insert,表示指定行前面插入操作。i的后面跟待插入内容,这些内容会新增到指定行号所在行的上一行.
比如 sed -e '3i\This is a new line.' t1.txt 表示在从t1.txt文件中读取到的数据的第3行前面插入This is a new line.文本,
并将结果打印到标准输出即终端/控制台(原文件内容并未改变)。
a : a即append,表示指定行后面追加操作。a的后面跟待追加写入的内容,这些内容会新增到指定行号所在行的下一行.
比如 sed -e '3a\This is a new line.' t1.txt 表示在从t1.txt文件中读取到的数据的第3行后面插入This is a new line.文本,
并将结果打印到标准输出即终端/控制台(原文件内容并未改变)。
删除操作:
d : d即delete,表示删除指定行操作。因为是删除,所以d后面通常不接任何东西.
比如 sed -e '3d' t1.txt 表示删除从t1.txt文件中读取到的数据的第3行内容,
并将处理后的文件结果打印到标准输出即终端/控制台(原文件内容并未改变)。
修改/编辑操作:
c : c即copy,表示覆盖指定的整行操作。c的后面接待写入内容,这些内容将替换/覆盖指定行处的原数据.
比如 sed -e '3c\This is a new line.' t1.txt 表示将从t1.txt文件中读取到的数据的第3行的内容,替换成This is a new line.文本,
并将结果打印到标准输出即终端/控制台(原文件内容并未改变)。
s : s即substitute,表示局部替换指定内容。将文件中指定的原内容替换为新内容.举例:s/lod/new/g
比如 sed -e 's/hello world/a new line/g' t1.txt 表示将t1.txt文件中读取到的数据中所有的hello world文本,替换成a new line;
参数g表示global即全局替换,替换文件中所有的;然后将结果打印到标准输出即终端/控制台(原文件内容并未改变)。
查看操作:
p : 打印。将匹配的数据打印出来。通常p选项会与参数-n 一起使用
其他操作:
n : 读取匹配的数据的下一行,覆盖模型空间的前一行(也就是被匹配的行),结果交给下一个参数处理
多行模式空间
N : 读取匹配的数据的下一行追加到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符
P : 打印指定内容。打印模式空间开端至\n(换行)之间的内容,并追加到默认输出之前。
D : 如果模式空间包含换行符,则删除模式空间开端至\n(换行)之间的内容, 并不会读取新的输入行,
而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
---------------------------------------------------------------------------------------
补充:替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\\1 子串匹配标记
& 已匹配字符串标记
其它
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
注意:
· · · 脚本参数/选项需要写到英文单引号内(’ ');
· · ·增、删、查等操作中,选项后面跟的符号都是反斜杠(\);例如:sed -e ‘3c\This is a new line.’ t1.txt
· · · 编辑修改操作中,选项后面所跟的符号是斜杠(/);例如: sed -e ‘s/hello world/a new line/g’ t1.txt
.
三、总结:
-
sed命令工作原理:
· · · 面向“行”处理,每次处理一行。处理时把要处理的行存储在缓冲区(此缓冲区被称为“模式空间”)中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕并接着处理下一行,不断重复直至处理完文件末尾一行。在整个处理过程中,sed 命令并不会对原文件本身进行任何更改,当然也允许通过-i参数将处理结果写回原文件(相当于直接修改原文件)。 -
sed命令工作流程:
主要包括读取、执行和显示三个过程。
· · · 读取:从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中。
· · · 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
· · · 显示:发送输出修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完毕。 -
sed命令各参数、选项:
· · · 参数:-e、 -i、 -f、 -r、-n 等;
· · · 脚本选项:增(i、a)、删(d)、改(c、s)、查( p) 等;