linux三剑客之sed命令,linux三杀手sed

 

 

第玖二节 linux三杀手之sed命令精讲

标签(空格分隔): Linux实战教学笔记-陈思齐

—越来越多材质点本人查看

一、前言

笔者们都知道,在Linux中整整皆文件,比如配置文件,日志文件,运转文件等等。假使我们相对这个文件实行一些编写制定查询等操作时,我们大概会想到一些vi,vim,cat,more等一声令下。可是那些命令功用不高,那就好比一块空地准备搭建房子,请了拾二个师傅拿着铁锹挖地基,花了1个月的时日才挖完,而其它一块空地则请了个挖土机,三下五除二就化解了,那正是成效。而在linux中的“挖土机”有二种型号:顶配awk,中配sed,标配grep。使用那一个工具,大家能够在直达平等效果的前提下节省大批量的重复性工作,进步功用。

sed 是Stream
Editor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家能够设想以下流水生产线,sed就如二个车间一律,文件中的每行字符都以原料,运到sed车间,然后经过一体系的加工处理,最终从流水生产线下来就改为货物了。

编排文件也是这么,在此以前笔者们修改一个安插文件,要求活动光标到某一行,然后添加点文字,然后又移动光标到另一行,注释点东西…….大概改动3个安插文件下来必要开支数十分钟,还有大概改错了安排文件,又得返工。那照旧二个布署文件,假使数十三个数百个呢?因而当您学会了sed命令,你会发现使用它处理公事中的一多重修改是很有用的。只要想到在差不离100多少个文本中,处理1柒个不等的编纂操作能够在几分钟以内实现,你就会知道sed的精锐了。

 

一、前言

我们都知情,在Linux中漫天皆文件,比如配置文件,日志文件,运营文件等等。要是我们相对那个文件举办一些编写制定查询等操作时,大家或者会想到一些vi,vim,cat,more等一声令下。然而这一个命令作用不高,那就好比一块空地准备搭建房子,请了拾1个师傅拿着铁锹挖地基,花了一个月的时刻才挖完,而别的一块空地则请了个挖土机,三下五除二就化解了,那正是效能。而在linux中的“挖土机”有两种型号:顶配awk,中配sed,标配grep。使用这么些工具,大家能够在完结同等效果的前提下节省大批量的重复性工作,提升功效。

sed 是Stream
艾德itor(字符流编辑器)的缩写,简称流编辑器。什么是流?我们能够设想以下流水生产线,sed就好像1个车间一律,文件中的每行字符都以原料,运到sed车间,然后经过一种类的加工处理,最终从流水线下来就成为货物了。

编排文件也是如此,从前笔者们修改一个布局文件,必要活动光标到某一行,然后添加点文字,然后又移动光标到另一行,注释点东西…….或然修改3个安插文件下来须要费用数十一分钟,还有大概改错了计划文件,又得返工。那依旧四个布局文件,如若数11个数百个吗?由此当您学会了sed命令,你会发觉使用它处理文件中的一文山会海修改是很有用的。只要想到在大概100多少个文件中,处理十多个分裂的编纂操作能够在几分钟之内完毕,你就会知晓sed的雄强了。

 

一、前言

咱俩都通晓,在Linux中总体皆文件,比如配置文件,日志文件,运行文件等等。假使大家相对那些文件进行一些编写制定查询等操作时,大家兴许会想到一些vi,vim,cat,more等一声令下。然而那么些命令成效不高,那就好比一块空地准备搭建房子,请了13个师傅拿着铁锹挖地基,花了一个月的日子才挖完,而除此以外一块空地则请了个挖土机,三下五除二就消除了,那就是功能。而在linux中的“挖土机”有二种型号:顶配awk,中配sed,标配grep。使用这一个工具,我们能够在达成相同服从的前提下节省大批量的重复性工作,升高作用。

sed 是Stream
艾德itor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家能够设想以下流水生产线,sed就如一个车间一律,文件中的每行字符都是原料,运到sed车间,然后经过一多元的加工处理,最终从流水生产线下来就改成货物了。

编辑文件也是这么,从前笔者们修改3个布局文件,必要活动光标到某一行,然后添加点文字,然后又移动光标到另一行,注释点东西…….也许修改二个配备文件下来供给费用数十秒钟,还有恐怕改错了安插文件,又得返工。那仍然三个布局文件,借使数十二个数百个呢?由此当你学会了sed命令,你会发觉接纳它处理公事中的一密密麻麻修改是很有用的。只要想到在大体100多少个公文中,处理17个不一致的编辑操作能够在几分钟之内完毕,你就会了然sed的强劲了。

 

1,前言

  • 笔者们都清楚,在Linux中漫天皆文件,比如配置文件,日志文件,运营文件等等。假如大家相对那一个文件举办一些编写制定查询等操作时,大家也许会想到一些vi,vim,cat,more等一声令下。可是那么些命令功效不高,那就好比一块空地准备搭建房子,请了1三个师傅拿着铁锹挖地基,花了2个月的时日才挖完,而除此以外一块空地则请了个挖土机,三下五除二就化解了,那就是作用。而在linux中的“挖土机”有三种型号:顶配awk,中配sed,标配grep。使用这个工具,我们可以在达成平等效力的前提下节省多量的重复性工作,提升成效。
  • 接下去我们就看一下sed的详细表达
  • sed 是Stream
    艾德itor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家能够想像以下流水线,sed就像是1个车间一律,文件中的每行字符都以原料,运到sed车间,然后通过一名目繁多的加工处理,最终从流程下来就改为货物了。

澳门金沙国际 1

  • 自然上图中的文件内容能够是出自文件,也得以直接源于键盘也许管道等专业输入,最后的结果暗中认可情况下是展现到终极的荧屏上,然则也得以出口到文件中。
  • 在此以前工厂中并未流水生产线时,生产一件商品供给十多个工种互相合作,那样下去利润太低,后来就有了流程,生产一件商品尽管依然有十几道工序,但都以机器化生产,工人只是匡助效用,那样利润就大大提升了,产量也大大进步了。
  • 编辑文件也是那样,从前笔者们修改贰个布局文件,要求活动光标到某一行,然后添加点文字,然后又移动光标到另一行,注释点东西…….大概改动一个安插文件下来需求开支数十分钟,还有恐怕改错了配备文件,又得返工。那依然二个布局文件,借使数十个数百个吗?由此当您学会了sed命令,你会发觉使用它处理文件中的一多级修改是很有用的。只要想到在大体100三个文件中,处理1柒个不一致的编纂操作能够在几分钟之内达成,你就会精通sed的精锐了。

贰 、软件功用与版本

Sed命令是操作,过滤和转换文本内容的有力工具。常用效用有增加和删除改查(扩充,删除,修改,查询),其中查询的服从中最常用的2马虎义是过滤(过滤钦赐字符串),取行(取出钦定行)。

作者们今天备选攻读的sed版本是GNU开源版本

[root@chengliang mail]# sed --version
GNU sed version 4.2.1

  

二 、软件功效与版本

Sed命令是操作,过滤和更换文本内容的强硬工具。常用功效有增加和删除改查(扩展,删除,修改,查询),在那之中查询的功效中最常用的2大作用是过滤(过滤内定字符串),取行(取出钦命行)。

咱俩后天准备上学的sed版本是GNU开源版本

[[email protected] mail]# sed --version
GNU sed version 4.2.1

  

二 、软件成效与版本

Sed命令是操作,过滤和转移文本内容的精锐工具。常用功能有增加和删除改查(增添,删除,修改,查询),个中查询的功用中最常用的2大功效是过滤(过滤钦命字符串),取行(取出内定行)。

大家前些天备选攻读的sed版本是GNU开源版本

[root@chengliang mail]# sed --version
GNU sed version 4.2.1

  

2,软件效率与版本

  • Sed命令是操作,过滤和更换文本内容的强大工具。常用功用有增加和删除改查(扩大,删除,修改,查询),当中查询的功能中最常用的2大功用是过滤(过滤内定字符串),取行(取出钦赐行)。
  • 咱们后天备选攻读的sed版本是GNU开源版本的,作者的尝试环境是CentOS6.8系统,内核版本是2.6.32-642.el6.x86_64
[root@chensiqi1 ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@chensiqi1 ~]# uname -r
2.6.32-642.el6.x86_64
[root@chensiqi1 ~]# sed --version   # 查看sed软件版本
GNU sed version 4.2.1

叁 、命令执行流程

Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再出口一行….

3次一行的宏图使得sed软件品质很高,sed在读取分外巨大的文本时不会出现卡顿的想象。我们都用过vi命令,用vi命令打开几十M或更大的文件,会意识有卡顿现象,那是因为 style=”color: #ff0000;”>vi命令打开文件是3次性将文件加载到内部存款和储蓄器,然后再打开,由此卡顿的小时长度就在于从磁盘到内部存款和储蓄器的读取速度了。而且一旦文件过大的话还会促成内部存款和储蓄器溢出现象。Sed软件就很好的防止了这种景色,打开速度相当慢,执行进度也十分的快。

现有三个文件person.txt,共有五行文本,sed命令读入文件person.txt的率先行“101,chensiqi,COO”,并将那行文本存入格局空间(sed软件在内部存储器中的贰个一时半刻缓存,用于存放读取到的剧情,比喻为工厂流水生产线的传递带。)

文本person.txt在格局空间的完整处理流程

  • 判定第③行是或不是是需求处理的行,如若不是要拍卖的行就重新从文件读取下一行,如若是要处理的行,则随之往下走。
  • 对情势空间的内容执行sed命令,比如a(追加),i(插入),s(替换)…
  • 将方式空间中经过sed命令处理后的始末输出到显示器上,然后清航空模型式空间
  • 读取下一行文本,然后再次履行上边包车型客车流程,直到文件截至

澳门金沙国际 2

sed是非交互式的编辑器。它不会修改文件,除非动用shell重定一贯保存结果。暗中认可情形下,所有的输骑行都被打字与印刷到显示屏上。

sed编辑器逐行处理文件(或输入),并将结果发送到荧屏。具体经过如下:首先sed把如今正在处理的行保存在多少个一时半刻缓存区中(也称为格局空间),然后处理一时半刻缓冲区中的行,完结后把该行发送到荧屏上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,举办拍卖和体现。处理完输入文件的末梢一行后,sed便结束运转。sed把每一行都存在权且缓冲区中,对这些副本进行编辑,所以不会修改原著件。

 

Sed软件有四个放置的囤积空间:

  • 格局空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(那几个缓冲区是在内部存储器中的),然后采取sed命令操作情势空间的内容。
  • 维持空间(hold
    space):是sed软件此外一个缓冲区,用来存放一时半刻数据,也是在内存中,但是方式空间和保持空间的用途是不相同等的。Sed能够交流保持空间和方式空间的数码,但是不可能在保障空间上实施平常的sed命令,也正是说我们得以在维持空间存款和储蓄数据。

 

叁 、命令执行流程

Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再出口一行….

一次一行的设计使得sed软件性能很高,sed在读取非常庞大的文件时不会出现卡顿的想象。大家都用过vi命令,用vi命令打开几十M或更大的文件,会发现有卡顿现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开,因此卡顿的时间长短就取决于从磁盘到内存的读取速度了。而且如果文件过大的话还会造成内存溢出现象。Sed软件就很好的避免了这种情况,打开速度非常快,执行速度也很快。

现有贰个文件person.txt,共有五行文本,sed命令读入文件person.txt的第③行“101,chensiqi,老板”,并将那行文本存入形式空间(sed软件在内部存储器中的3个一时半刻缓存,用于存放读取到的始末,比喻为工厂流水生产线的传递带。)

文本person.txt在方式空间的总体处理流程

  • 判断第③行是还是不是是须求处理的行,假如不是要处理的行就重新从文件读取下一行,假若是要处理的行,则随之往下走。
  • 对格局空间的始末执行sed命令,比如a(追加),i(插入),s(替换)…
  • 将格局空间中通过sed命令处理后的始末输出到显示屏上,然后清航空模型式空间
  • 读取下一行文本,然后重新履行上边的流水生产线,直到文件甘休

澳门金沙国际 3

sed是非交互式的编辑器。它不会修改文件,除非动用shell重定向来保存结果。暗中同意情况下,全数的输出游都被打字与印刷到显示器上。
sed编辑器逐行处理公事(或输入),并将结果发送到荧屏。具体经过如下:首先sed把当下正在处理的行保存在一个临时缓存区中(也称之为形式空间),然后处理暂且缓冲区中的行,达成后把该行发送到显示屏上。sed每处理完一行就将其从权且缓冲区删除,然后将下一行读入,进行处理和呈现。处理完输入文件的最后一行后,sed便结束运维。sed把每一行都设有一时缓冲区中,对这些副本举办编写制定,所以不会修改原来的作品件。
 

Sed软件有七个放置的蕴藏空间:

  • 形式空间(pattern
    space):是sed软件从文本读取一行文本然后存入的缓冲区(这几个缓冲区是在内部存款和储蓄器中的),然后选拔sed命令操作形式空间的内容。
  • 保持空间(hold
    space):是sed软件其余2个缓冲区,用来存放一时数据,也是在内部存款和储蓄器中,然而情势空间和维系空间的用处是不一致的。Sed能够换来保持空间和形式空间的多寡,可是不能够在维系空间上执行常常的sed命令,也正是说我们得以在保险空间存款和储蓄数据。

 

三 、命令执行流程

Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再出口一行….

一回一行的统一筹划使得sed软件品质很高,sed在读取相当庞大的文件时不会油可是生卡顿的想像。我们都用过vi命令,用vi命令打开几十M或更大的公文,会意识有卡顿现象,那是因为 style=”color: #ff0000;”>vi命令打开文件是一次性将文件加载到内部存款和储蓄器,然后再打开,因而卡顿的光阴长度就在于从磁盘到内部存款和储蓄器的读取速度了。而且若是文件过大的话还会导致内部存款和储蓄器溢出现象。Sed软件就很好的避免了那种场合,打开速度越发快,执行进程也极快。

幸存三个文件person.txt,共有五行文本,sed命令读入文件person.txt的第2行“101,chensiqi,COO”,并将那行文本存入方式空间(sed软件在内部存储器中的四个一时半刻缓存,用于存放读取到的始末,比喻为工厂流水生产线的传递带。)

文本person.txt在方式空间的完全处理流程

  • 判断第贰行是还是不是是须要处理的行,假若不是要处理的行就再次从文件读取下一行,若是是要拍卖的行,则接着往下走。
  • 对方式空间的内容执行sed命令,比如a(追加),i(插入),s(替换)…
  • 将方式空间中经过sed命令处理后的始末输出到显示屏上,然后清航空模型式空间
  • 读取下一行文本,然后再次履行上边的流程,直到文件停止

澳门金沙国际 4

sed是非交互式的编辑器。它不会修改文件,除非接纳shell重定一向保存结果。暗中同意情形下,全体的输骑行都被打字与印刷到显示屏上。

sed编辑器逐行处理文件(或输入),并将结果发送到荧屏。具体进程如下:首先sed把方今正值处理的行保存在1个近日缓存区中(也叫做方式空间),然后处理一时半刻缓冲区中的行,达成后把该行发送到显示屏上。sed每处理完一行就将其从权且缓冲区删除,然后将下一行读入,实行处理和展示。处理完输入文件的结尾一行后,sed便截止运转。sed把每一行都留存近来缓冲区中,对那些副本举办编写制定,所以不会修改原作件。

 

Sed软件有四个放置的囤积空间:

  • 情势空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(这一个缓冲区是在内部存款和储蓄器中的),然后选拔sed命令操作形式空间的内容。
  • 保持空间(hold
    space):是sed软件其它贰个缓冲区,用来存放临时数据,也是在内部存储器中,但是情势空间和保持空间的用处是不平等的。Sed能够换到保持空间和情势空间的数量,可是无法在保持空间上进行平常的sed命令,也正是说大家得以在保险空间存款和储蓄数据。

 

3,语法格式

sed [options] [sed -commands][input -file]
sed [选项]  【sed命令】 【输入文件】

说明:
1,注意sed软件以及背后选项,sed命令和输入文件,每种成分之间都至少有二个空格。
2,为了制止混淆,本文称呼sed为sed软件。sed
-commands(sed命令)是sed软件内置的一对指令选项,为了和眼下的options(选项)区分,故称为sed命令
3,sed -commands 既能够是单个sed命令,也足以是七个sed命令组合。
4,input -file (输入文件)是可采纳,sed还是能够从专业输入如管道获取输入。

四 、使用规范文件

[root@chengliang zcl]# cat zcl.txt
[root@chengliang zcl]# cat > zcl.txt <<KOF
> 101,chengliang,aa
> 102,alex,bb
> 103,eric,cc
> 104,laonanhai,dd
> KOF
[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

KOF必须成对出现,表示终止输入

指令表明:使用一条cat命令创建多行文本,文件包蕴上边的内容,后边的操作都会使用那几个文件。

 

④ 、使用专业文件

[[email protected] zcl]# cat zcl.txt
[[email protected] zcl]# cat > zcl.txt <<KOF
> 101,chengliang,aa
> 102,alex,bb
> 103,eric,cc
> 104,laonanhai,dd
> KOF
[[email protected] zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

KOF必须成对出现,表示终止输入

一声令下表明:使用一条cat命令创制多行文本,文件蕴含上边的内容,前边的操作都会动用那一个文件。

 

肆 、使用规范文件

[root@chengliang zcl]# cat zcl.txt
[root@chengliang zcl]# cat > zcl.txt <<KOF
> 101,chengliang,aa
> 102,alex,bb
> 103,eric,cc
> 104,laonanhai,dd
> KOF
[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

KOF必须成对现身,表示终止输入

命令表达:使用一条cat命令创造多行文本,文件包蕴上边的情节,前面包车型地铁操作都会动用那一个文件。

 

4,命令执行流程

总结流程

Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再出口一行….

小知识:

3遍一行的设计使得sed软件品质很高,sed在读取相当巨大的文本时不会出现卡顿的想象。大家都用过vi命令,用vi命令打开几十M或更大的文本,会发觉有卡顿现象,那是因为vi命令打开文件是三回性将文件加载到内部存款和储蓄器,然后再打开,由此卡顿的日子长短就取决于从磁盘到内部存款和储蓄器的读取速度了。而且一旦文件过大的话还会造成内部存款和储蓄器溢出景况。Sed软件就很好的幸免了那种情形,打开速度特别快,执行进程也非常的慢。

【澳门金沙国际】Linux实战教学笔记12,linux三徘徊花之sed命令。详细流程:

幸存三个文书person.txt,共有五行文本,sed命令读入文件person.txt的第叁行“101,chensiqi,CEO”,并将这行文本存入形式空间(sed软件在内部存储器中的1个临时缓存,用于存放读取到的内容,比喻为工厂流水线的传递带。)

文件person.txt在形式空间的全部处理流程

1,判断第①行是不是是要求处理的行,倘若不是要处理的行就重新从文件读取下一行,固然是要处理的行,则随即往下走。
2,对方式空间的内容执行sed命令,比如a(追加),i(插入),s(替换)…
3,将格局空间中通过sed命令处理后的始末输出到显示屏上,然后清航空模型式空间
4,读取下一行文本,然后再一次履行上边的流水生产线,直到文件甘休

上面包车型大巴流水生产线包罗如下图所示
澳门金沙国际 5

Sed软件有八个放置的贮存空间:

  • 情势空间(pattern
    space):是sed软件从文本读取一行文本然后存入的缓冲区(这几个缓冲区是在内部存储器中的),然后利用sed命令操作情势空间的始末。
  • 维持空间(hold
    space):是sed软件其它八个缓冲区,用来存放在一时数据,也是在内部存款和储蓄器中,不过格局空间和维持空间的用途是区别等的。Sed能够交流保持空间和方式空间的数码,但是不可能在有限支持空间上进行日常的sed命令,也便是说大家能够在维持空间存款和储蓄数据。

⑤ 、常用功用-增删改查

1、增

比如说大家日常往配置文件写入几行文本,最常用的是vi或vim命令,不过那3个指令是一种交互式的授命,还索要大家在vi/vim编辑器界面输入字符串然后保留退出,操作某些麻烦可是还是能用。不过当大家学会了Shell脚本后,大家就会意识在本子中不能健康使用vi或vim命令,为啥吗?同学们请自行体验。

此处大家须求用到一个sed命令,分别是:

  • “a”:追加文本到钦定行后,记念方法:a的全拼是append,意思是扩张。
  • “i“:插入文本到钦赐行前,记念方法:i的全拼是insert,意思是插入。

在文书中扩大一行文本,我们之前学过echo命令能够在文书的尾声追加文本,相比简单,可是大家还有别的的复杂必要,比如在第九行插入一行数字等等,那里就必要sed出马了。

[root@chengliang zcl]# sed "2a hahaha" zcl.txt
101,chengliang,aa
102,alex,bb
hahaha  #新增的那句
103,eric,cc
104,laonanhai,dd

伍 、常用作用-增加和删除改查

1、增

例如我们平日往配置文件写入几行文本,最常用的是vi或vim命令,然而那么些指令是一种交互式的一声令下,还须求大家在vi/vim编辑器界面输入字符串然后保留退出,操作有个别麻烦不过还是能用。但是当大家学会了Shell脚本后,大家就会发今后本子中不可能健康使用vi或vim命令,为何吧?同学们请自行体验。

此间大家须要用到贰个sed命令,分别是:

  • “a”:追加文本到钦点行后,记念方法:a的全拼是apend,意思是充实。
  • “i“:插入文本到钦赐行前,纪念方法:i的全拼是insert,意思是插入。

在文书中扩展一行文本,咱们从前学过echo命令能够在文书的末段追加文本,相比较容易,但是大家还有其余的错综复杂需求,比如在第九行插入一行数字等等,那里就供给sed出马了。

[[email protected] zcl]# sed "2a hahaha" zcl.txt
101,chengliang,aa
102,alex,bb
hahaha  #新增的那句
103,eric,cc
104,laonanhai,dd

5、常用效率-增删改查

1、增

比如我们平时往配置文件写入几行文本,最常用的是vi或vim命令,然而那三个指令是一种交互式的下令,还索要我们在vi/vim编辑器界面输入字符串然后保留退出,操作有个别麻烦不过还能够用。不过当大家学会了Shell脚本后,我们就会发今后剧本中无法平常使用vi或vim命令,为何吗?同学们请自行体验。

那边大家必要用到二个sed命令,分别是:

  • “a”:追Gavin本到内定行后,纪念方法:a的全拼是append,意思是增加。
  • “i“:插入文本到钦定行前,回想方法:i的全拼是insert,意思是插入。

在文件中追加一行文本,我们原先学过echo命令能够在文书的末段追加文本,相比较简单,不过大家还有别的的繁杂供给,比如在第7行插入一行数字等等,那里就必要sed出马了。

[root@chengliang zcl]# sed "2a hahaha" zcl.txt
101,chengliang,aa
102,alex,bb
hahaha  #新增的那句
103,eric,cc
104,laonanhai,dd

5,选项表明

option[选项] 解释说明(带*的为重点)
-n 取消默认的sed软件的输出,常与sed命令的p连用。*
-e 一行命令语句可以执行多条sed命令
-f 选项后面可以接sed脚本的文件名
-r 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
-i 直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件*
sed -commands[sed命令] 解释说明(带*的为重点)
a 追加,在指定行后添加一行或多行文本*
c 取代指定的行
d 删除指定的行*
D 删除模式空间的部分内容,直到遇到换行符\n结束操作,与多行模式相关
i 插入,在指定行前添加一行或多行文本*
h 把模式空间的内容复制到保持空间
H 把模式空间的内容追加到保持空间
g 把保持空间的内容复制到模式空间
G 把保持空间的内容追加到模式空间
x 交换模式空间和保持空间的内容
l 打印不可见的字符
n 清空模式空间的内容并读入下一行
N 不清空模式空间,并读取下一行数据并追加到模式空间*
p 打印模式空间内容,通常p会与选项-n一起使用*
P(大写) 打印模式空间的内容,直到遇到换行符\n结束操作
q 退出Sed
r 从指定文件读取数据
s 取代,s#old#new#g==>这里g是s命令的替代标志,注意和g命令区分。*
w 另存,把模式空间的内容保存到文件中
y 根据对应位置转换字符
:label 定义一个标签
b label 执行该标签后面的命令
t 如果前面的命令执行成功,那么就跳转到t指定的标签处,继续往下执行后续命令。否则,仍然继续正常的执行流程
特殊符号 解释说明(带*的为重点)
对指定行以外的所有行应用命令*
= 打印当前行行号
“First~step”表示从First行开始,以步长Step递增
& 代表被替换的内容
实现一行命令语句可以执行多条sed命令*
{} 对单个地址或地址范围执行批量操作
+ 地址范围中用到的符号,做加法运算

引号的不一致总计

sed使用的长河中用单引号依然双引号?那里给我们详细说说引号的界别。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed '2i $PATH' zcl.txt     #单引号--文本内容原封不动插入
101,chengliang,aa
$PATH
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed "2i $PATH" zcl.txt    #双引号--变量$PATH被解析以后在当作文本进行插入
101,chengliang,aa
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed 2i $PATH zcl.txt    #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行
sed: -e expression #1, char 2: expected \ after `a', `c' or `i'
[root@chengliang zcl]# 

总结:

  • 一旦引号里面是无独有偶字符串的话,你能够无限制使用单引号大概双引号:
  • 若是引号里面是变量也许带反引号的一声令下的话,你想要变量解析的结果或然命令执行的结果,那就应用双引号;你想要引号内的颜值字符串,那就利用单引号。

引号的界别总括

sed使用的进程中用单引号仍旧双引号?那里给大家详细说说引号的区分。

[[email protected] zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed '2i $PATH' zcl.txt     #单引号--文本内容原封不动插入
101,chengliang,aa
$PATH
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed "2i $PATH" zcl.txt    #双引号--变量$PATH被解析以后在当作文本进行插入
101,chengliang,aa
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed 2i $PATH zcl.txt    #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行
sed: -e expression #1, char 2: expected \ after `a', `c' or `i'
[[email protected] zcl]# 

总结:

  • 如果引号里面是平凡字符串的话,你能够随意使用单引号或然双引号:
  • 如果引号里面是变量可能带反引号的吩咐的话,你想要变量解析的结果要么命令执行的结果,那就接纳双引号;你想要引号内的样子字符串,那就采用单引号。

引号的区分总括

sed使用的进度中用单引号依然双引号?那里给我们详细说说引号的分别。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed '2i $PATH' zcl.txt     #单引号--文本内容原封不动插入
101,chengliang,aa
$PATH
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed "2i $PATH" zcl.txt    #双引号--变量$PATH被解析以后在当作文本进行插入
101,chengliang,aa
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed 2i $PATH zcl.txt    #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行
sed: -e expression #1, char 2: expected \ after `a', `c' or `i'
[root@chengliang zcl]# 

总结:

  • 要是引号里面是平常字符串的话,你能够专擅使用单引号可能双引号:
  • 假诺引号里面是变量可能带反引号的一声令下的话,你想要变量解析的结果依然命令执行的结果,那就利用双引号;你想要引号内的外貌字符串,那就动用单引号。

6,使用范例

累加多行文本

-e     enable
interpretation of backslash escapes    //启用反斜杠转义解释

[root@chengliang zcl]# echo "zcl";echo "zcl"
zcl
zcl
[root@chengliang zcl]# echo "zcl\nzcl"      
zcl\nzcl
[root@chengliang zcl]# echo -e "zcl\nzcl"
zcl
zcl
[root@chengliang zcl]# 

指令表明:那里就“\n”派上用场了,行与行之间是以“\n”作为分隔符的,所以“chensiqi\nchensiqi”就等效于2行chensiqi。接下来大家用echo命令实验一下,在那之中-e参数表示字符串中一旦出现以下特殊字符(\n代表换行,\t代表Tab键等),则加以特殊处理,而不会将它便是一般文字输出。

[root@chengliang zcl]# sed "2a wawawa\nhahaha" zcl.txt
101,chengliang,aa
102,alex,bb
wawawa
hahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

当然还有其余一种办法添加多行文本,但那种艺术并不曾“\n”方便,所以在那边就回顾说一下。那种措施应用了“\”,它也有换行的情趣。若是大家在履行一行非常短的指令时候,如果都写在一行,那太无耻了也麻烦了解,因而就选取到了这几个标记能够将一条完整的一声令下分成多行,举个例证:

[root@chengliang zcl]# echo my \        
> name\
> is \
> zcl
my nameis zcl
[root@chengliang zcl]# 

sed命令使用反斜线,首先输入完“sed ‘2a
106,dandan,CSO
\”,然后敲回车键,这样窗口会来得二个标记“>”,大家在那些标记后边跟着写命令的剩余部分“107,bingbing,CCO‘
person.txt”。

[root@chengliang zcl]#  sed '2a 106,dandan,CSO \
> 107,bingibng,CCO' \  
> zcl.txt
101,chengliang,aa
102,alex,bb
106,dandan,CSO 
107,bingibng,CCO
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

sed软件应用命令i插入多行文本和指令和a的用法是同等的,由此那里不再详细列出,我们能够演练一下

 

添加多行文本

-e     enable interpretation of backslash escapes  
 //启用反斜杠转义解释

[[email protected] zcl]# echo "zcl";echo "zcl"
zcl
zcl
[[email protected] zcl]# echo "zcl\nzcl"      
zcl\nzcl
[[email protected] zcl]# echo -e "zcl\nzcl"
zcl
zcl
[[email protected] zcl]# 

命令说明:那里就“\n”派上用场了,行与行时期是以“\n”作为分隔符的,所以“chensiqi\nchensiqi”就等效于2行chensiqi。接下来大家用echo命令实验一下,当中-e参数表示字符串中只要出现以下特殊字符(\n代表换行,\t代表Tab键等),则加以特殊处理,而不会将它便是一般文字输出。

[[email protected] zcl]# sed "2a wawawa\nhahaha" zcl.txt
101,chengliang,aa
102,alex,bb
wawawa
hahaha
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

本来还有此外一种格局添加多行文本,但那种方法并没有“\n”方便,所以在此间就不难说一下。那种方式应用了“\”,它也有换行的趣味。若是大家在执行一行非常长的下令时候,要是都写在一行,那太丢人了也难以知晓,由此就使用到了那么些符号能够将一条完整的授命分成多行,举个例子:

[[email protected] zcl]# echo my \        
> name\
> is \
> zcl
my nameis zcl
[[email protected] zcl]# 

sed命令使用反斜线,首先输入完“sed ‘2a 106,dandan,CSO
\”,然后敲回车键,那样窗口会来得一个标志“>”,大家在那个符号后边跟着写命令的剩下部分“107,bingbing,CCO‘
person.txt”。

[[email protected] zcl]#  sed '2a 106,dandan,CSO \
> 107,bingibng,CCO' \  
> zcl.txt
101,chengliang,aa
102,alex,bb
106,dandan,CSO 
107,bingibng,CCO
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

sed软件应用命令i插入多行文本和下令和a的用法是一律的,由此那里不再详细列出,大家能够操练一下

 

添加多行文本

-e     enable
interpretation of backslash escapes    //启用反斜杠转义解释

[root@chengliang zcl]# echo "zcl";echo "zcl"
zcl
zcl
[root@chengliang zcl]# echo "zcl\nzcl"      
zcl\nzcl
[root@chengliang zcl]# echo -e "zcl\nzcl"
zcl
zcl
[root@chengliang zcl]# 

一声令下表明:那里就“\n”派上用场了,行与行以内是以“\n”作为分隔符的,所以“chensiqi\nchensiqi”就等效于2行chensiqi。接下来大家用echo命令实验一下,个中-e参数表示字符串中固然现身以下特殊字符(\n代表换行,\t代表Tab键等),则加以特殊处理,而不会将它当成一般文字输出。

[root@chengliang zcl]# sed "2a wawawa\nhahaha" zcl.txt
101,chengliang,aa
102,alex,bb
wawawa
hahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

当然还有别的一种办法添加多行文本,但那种艺术并从未“\n”方便,所以在那边就不难说一下。那种措施运用了“\”,它也有换行的情致。如果咱们在推行一行相当短的吩咐时候,尽管都写在一行,那太丢人了也不便知晓,因而就动用到了那一个标记能够将一条完整的通令分成多行,举个例子:

[root@chengliang zcl]# echo my \        
> name\
> is \
> zcl
my nameis zcl
[root@chengliang zcl]# 

sed命令使用反斜线,首先输入完“sed ‘2a
106,dandan,CSO
\”,然后敲回车键,这样窗口会显得三个标志“>”,大家在这么些标记前边随着写命令的剩余部分“107,bingbing,CCO‘
person.txt”。

[root@chengliang zcl]#  sed '2a 106,dandan,CSO \
> 107,bingibng,CCO' \  
> zcl.txt
101,chengliang,aa
102,alex,bb
106,dandan,CSO 
107,bingibng,CCO
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

sed软件使用命令i插入多行文本和下令和a的用法是一样的,由此那里不再详细列出,我们能够演习一下

 

6.1 统一实验文本

为了更好的测试sed命令的用法,大家供给桑土绸缪好上面的测试文件。

[root@chensiqi1 ~]# cat >person.txt<<KOF
> 101,chensiqi,CEO
> 102,zhangyang,CTO
> 103,Alex,COO
> 104,yy,CFO
> 105,feixue,CIO
> KOF          #KOF必须成对出现,表示终止输入
命令说明:使用一条cat命令创建多行文本,文件包含上面的内容,后面的操作都会使用这个文件。

商店案例1:优化SSH配置(一键成功增添多少参数

在我们上学CentOS6种类优化时,有三个优化点:更改ssh服务远程登录的计划。首要的操作是在ssh的配置文件/etc/ssh/sshd_config参预下边5行文本。

Port 52113    #ssh服务端口
PermitRootLogin no    #不允许root远程登陆
PermitEmptyPasswords no    #不允许密码为空
UseDNS no
GSSAPIAuthentication no

本来大家得以选择vi/vim命令编辑这一个文件,可是这么就比较费心,今后想用一条命令增添5行文本到第③3行前?

[root@chengliang ~]# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“\n”就可以变成一行了。
上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。
[root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

 

商厦案例1:优化SSH配置(一键完事扩张多少参数

在我们上学CentOS6系统优化时,有1个优化点:更改ssh服务远程登录的配置。首要的操作是在ssh的配备文件/etc/ssh/sshd_config参与上面5行文本。

Port 52113    #ssh服务端口
PermitRootLogin no    #不允许root远程登陆
PermitEmptyPasswords no    #不允许密码为空
UseDNS no
GSSAPIAuthentication no

理所当然大家得以运用vi/vim命令编辑这些文件,不过这样就比较劳累,未来想用一条命令扩大5行文本到第三3行前?

[[email protected] ~]# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“\n”就可以变成一行了。
上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。
[[email protected] ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

 

商户案例1:优化SSH配置(一键形成扩充多少参数

在大家上学CentOS6系列优化时,有1个优化点:更改ssh服务远程登录的布置。首要的操作是在ssh的配置文件/etc/ssh/sshd_config参与上面5行文本。

Port 52113    #ssh服务端口
PermitRootLogin no    #不允许root远程登陆
PermitEmptyPasswords no    #不允许密码为空
UseDNS no
GSSAPIAuthentication no

当然大家能够行使vi/vim命令编辑那些文件,可是这么就相比较费心,未来想用一条命令扩张5行文本到第二3行前?

[root@chengliang ~]# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“\n”就可以变成一行了。
上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。
[root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

 

6.2 常用功能-增加和删除改查

接下去我们就起来上学sed命令的“四斧头”–>增,删,改,查。我们也不用着急,大家三个1个的学过去,热豆腐要逐级的吃。

剔除内定行文本

地址范围 含义
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7…..行操作
10,\${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,\${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands} 对匹配chensiqi的行到其后的2行操作

假诺在sed命令后边不钦点地址范围,那么暗许会合营全部行,然后采纳d命令删除成效就会去除这些文件的有着内容

[root@chengliang zcl]# cat test.txt  
welcome to my blog:http://www.cnblogs.com/0zcl

if you like my blog\'s contents,please support me!


bye! boys and girls.
[root@chengliang zcl]# sed "d" test.txt
[root@chengliang zcl]# 

单行删除想必大家能驾驭,内定删除第1行的文本102,alex,bb

[root@chengliang zcl]# sed "2d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

“2,3d” 钦赐删除第一行到第三行的始末,d代表删除操作。

[root@chengliang zcl]# sed "2,3d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]#

  

除去钦赐行文本

地址范围 含义
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7…..行操作
10,\${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,\${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands} 对匹配chensiqi的行到其后的2行操作

只要在sed命令前边不钦点地点范围,那么私下认可会同盟全部行,然后使用d命令删除功效就会去除那一个文件的全体内容

[[email protected] zcl]# cat test.txt  
welcome to my blog:http://www.cnblogs.com/0zcl

if you like my blog\'s contents,please support me!


bye! boys and girls.
[[email protected] zcl]# sed "d" test.txt
[[email protected] zcl]# 

单行删除想必大家能领略,钦定删除第1行的文本102,alex,bb

[[email protected] zcl]# sed "2d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

“2,3d”
钦命删除第3行到第1行的情节,d代表删除操作。

[[email protected] zcl]# sed "2,3d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[[email protected] zcl]#

  

删去钦定行文本

地址范围 含义
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7…..行操作
10,\${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,\${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands} 对匹配chensiqi的行到其后的2行操作

假诺在sed命令前边不点名地方范围,那么默许会协作全体行,然后使用d命令删除成效就会删除那个文件的持有情节

[root@chengliang zcl]# cat test.txt  
welcome to my blog:http://www.cnblogs.com/0zcl

if you like my blog\'s contents,please support me!


bye! boys and girls.
[root@chengliang zcl]# sed "d" test.txt
[root@chengliang zcl]# 

单行删除想必大家能通晓,内定删除第1行的文件102,alex,bb

[root@chengliang zcl]# sed "2d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

“2,3d” 钦点删除第②行到第三行的始末,d代表删除操作。

[root@chengliang zcl]# sed "2,3d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]#

  

6.2.1 增

  • 接下去本人来教大家第③式招法–>往文件钦命地方扩充或插队钦定文本。
  • 这几个效用格外有用,比如大家常常往配置文件写入几行文本,最常用的是vi或vim命令,不过那1个指令是一种交互式的通令,还要求我们在vi/vim编辑器界面输入字符串然后保留退出,操作有些麻烦不过还是可以用。可是当大家学会了Shell脚本后,我们就会意识在本子中不可能健康使用vi或vim命令,为啥吗?同学们请自行体验。
  • 大家上学Shell脚本主如果为领会放大家的单手,执行三个剧本,然后自行往文件中写入数据,不需求大家再起始。因而大家想到了sed软件,它亦可援助大家贯彻指标。
  • 此间大家需求用到一个sed命令,分别是:
    “a”:追加文本到内定行后,记念方法:a的全拼是apend,意思是充实。
    “i“:插入文本到钦点行前,纪念方法:i的全拼是insert,意思是插入。

正则匹配删除

地点大家尝试完了数字地址范围,接下去大家尝试一下正则表明式的地点范围,就算说能够选择正则表明式,可是大家仍旧习惯写出总体的匹配字符串,达到标准匹配的指标。

在sed软件中,使用正则的格式和awk一样,使用3个”/“包涵钦定的正则表明式,即“/正则表明式/”。”/alex/d”有哪一行有alex则删除这一行。

[root@chengliang zcl]# sed "/alex/d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

那是正则表明式方式的多行删除,也是以逗号分隔1个地点,最终结果是剔除包罗“alex”的行到蕴涵“eric”的行

[root@chengliang zcl]# sed "/alex/,/eric/d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]# 

学过正则表明式后咱们精晓“$”代表行尾,可是在sed中就有一些转移了,“$”在sed中意味文件的末段一行。由此本例子的意思是剔除第叁行到最终一行的文书,包括第三行和结尾一行,由此只剩余第贰行的剧情。

[root@chengliang zcl]# sed "2,$d" zcl.txt
sed: -e expression #1, char 2: unexpected `,'
[root@chengliang zcl]# sed "2,\$d" zcl.txt
101,chengliang,aa
[root@chengliang zcl]# sed '2,$d' zcl.txt    
101,chengliang,aa
[root@chengliang zcl]# 

在工作中大家最常用的还是数字地址那种精确匹配格局,像下面的正则地址或混合地址那种歪曲匹配用的可比少,掌握即可。

现实可参照:

 

正则匹配删除

下面大家尝试完了数字地址范围,接下去大家尝试一下正则表达式的地点范围,即便说能够选取正则表达式,不过大家依旧习惯写出一体化的匹配字符串,达到准确匹配的指标。

在sed软件中,使用正则的格式和awk一样,使用二个”/“包涵钦命的正则表明式,即“/正则表明式/”。”/alex/d”有哪一行有alex则删除这一行。

[[email protected] zcl]# sed "/alex/d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

那是正则表明式情势的多行删除,也是以逗号分隔1个地点,最后结果是去除包括“alex”的行到包蕴“eric”的行

[[email protected] zcl]# sed "/alex/,/eric/d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[[email protected] zcl]# 

学过正则表明式后大家领略“$”代表行尾,可是在sed中就有部分浮动了,“$”在sed中表示文件的最终一行。由此本例子的含义是去除第叁行到最终一行的文本,包括第③行和尾声一行,因此只剩下第二行的始末。

[[email protected] zcl]# sed "2,$d" zcl.txt
sed: -e expression #1, char 2: unexpected `,'
[[email protected] zcl]# sed "2,\$d" zcl.txt
101,chengliang,aa
[[email protected] zcl]# sed '2,$d' zcl.txt    
101,chengliang,aa
[[email protected] zcl]# 

在工作中大家最常用的要么数字地址那种精确匹配情势,像上面的正则地址或混合地址那种歪曲匹配用的可比少,领悟即可。

现实可参照:

 

正则匹配删除

地点大家尝试完了数字地址范围,接下去大家尝试一下正则表明式的地址范围,固然说能够接纳正则表达式,可是我们照旧习惯写出一体化的匹配字符串,达到标准匹配的目的。

在sed软件中,使用正则的格式和awk一样,使用3个”/“包括内定的正则表达式,即“/正则表明式/”。”/alex/d”有哪一行有alex则删除这一行。

[root@chengliang zcl]# sed "/alex/d" zcl.txt
101,chengliang,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

那是正则表明式格局的多行删除,也是以逗号分隔3个地点,最终结果是去除包蕴“alex”的行到蕴涵“eric”的行

[root@chengliang zcl]# sed "/alex/,/eric/d" zcl.txt
101,chengliang,aa
104,laonanhai,dd
[root@chengliang zcl]# 

学过正则表明式后大家知道“$”代表行尾,但是在sed中就有一对变型了,“$”在sed中意味着文件的末段一行。因而本例子的意义是剔除第1行到结尾一行的文件,包涵第壹行和最终一行,因而只剩余第②行的内容。

[root@chengliang zcl]# sed "2,$d" zcl.txt
sed: -e expression #1, char 2: unexpected `,'
[root@chengliang zcl]# sed "2,\$d" zcl.txt
101,chengliang,aa
[root@chengliang zcl]# sed '2,$d' zcl.txt    
101,chengliang,aa
[root@chengliang zcl]# 

在工作中大家最常用的只怕数字地址那种精确匹配情势,像上边的正则地址或混合地址那种歪曲匹配用的相比少,掌握即可。

具体可参看:

 

6.2.1.1 单行增

率先大家看一下单行扩充的用法,说白了就是在文书中追加一行文本,大家原先学过echo命令能够在文件的末梢追加文本,比较简单,然而我们还有别的的错综复杂供给,比如在第8行插入一行数字等等,那里就须要sed出马了。大家来看一下下边包车型地铁事例,同学也随即例子一起演习,命令唯有多练才会熟谙,光看千古是学不会的。

[root@chensiqi1 ~]# sed '2a 106,dandan,CSO' person.txt
101,chensiqi,CEO
102,zhangyang,CTO
106,dandan,CSO   #这就是新增那句
103,Alex,COO
104,yy,CFO
105,feixue,CIO

指令行详解:

率先大家看一下命令的结果,大家得以看看原来的第3行“102,zhangyang,CTO”
前边插入了新的一条龙为“106,dandan,CSO”,原来的第1行变成第贰行了。
接下去大家解读一下sed语句的结构,sed打头,然后接上空格(空格个数不限,但最少要有一个!)在空格后边,大家先敲上一对单引号(“)然后退格在单引号中协商‘106,dandan,CSO’。

  • 2意味钦赐对第1行操作,别的的行忽略
  • i代表插入的意趣,2i即在第②行前布署文本
  • 2i背后加上空格,然后跟上您想要插入的公文即可

澳门金沙国际 6
最终接上你想要处理的公文person.txt

特殊符号~(步长)解析

格式:“First~step”表示从开始,以急剧step递增,那一个在数学中称之为等差数列

例子:

  • 1~2
    匹配1,3,5,7…..#–>用于只输出奇书行,大伙仔细考察一下各样数字的差值。
  • 2~2 匹配2,4,6,8….#–>用于只输出偶数行
  • 1~3 匹配1,4,7,10…..
  • 2~3 匹配2,5,8,11…..

    [root@chengliang zcl]# seq 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@chengliang zcl]# seq 10 | sed -n “1~2p”
    1
    3
    5
    7
    9
    [root@chengliang zcl]#

命令表达:seq命令能够转移从1到10的数字系列

一声令下表明:上边包车型地铁指令首要表明特殊符号“~”的效率,其余sed命令用法n和p请见后文详解,我们只须求理解那一个命令能够将“1~2”钦赐的行展现出来即可。

假设我们想生成奇数数列,其实下面的法子是为着举例,并不是1个很好的办法,因为seq命令自带那种效益。

[root@chengliang zcl]# seq 1 2 10
1
3
5
7
9
[root@chengliang zcl]# 

一声令下表明:seq命令格式seq起先值 公差
停止值

[root@chengliang zcl]# sed "1~2d" zcl.txt
102,alex,bb
104,laonanhai,dd
[root@chengliang zcl]# sed "1,+2d" zcl.txt
104,laonanhai,dd
[root@chengliang zcl]# 

指令表明:“1~2”这是钦命行数的另一种格式,从第3行开端以小幅度2递增的行(1,3,5),因而删掉第③,3,5行,即全数的奇数行。

指令表明:那实际上是做个加法运算,‘1,+2d’==>删除第壹行到第二(1+2)行的公文。

[root@chengliang zcl]# sed '2,3!d' zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

命令表明:在地点范围“2,3”前边加上“
!”,假使不加“!”表示删除第贰行和第1行,结果如上面的例证所示,然后加上“!”的结果便是除了第一行和第③行以外的情节都剔除,那几个主意能够看作显示文件的第3,3行难点的补给措施。

 

特殊符号~(步长)解析

格式:“First~step”表示从上马,以大幅step递增,这些在数学中称之为等差数列

例子:

  • 1~2
    匹配1,3,5,7…..#–>用于只输出奇书行,大伙仔细考察一下各个数字的差值。
  • 2~2 匹配2,4,6,8….#–>用于只输出偶数行
  • 1~3 匹配1,4,7,10…..
  • 2~3 匹配2,5,8,11…..

[[email protected] zcl]# seq 10
1
2
3
4
5
6
7
8
9
10
[[email protected] zcl]# seq 10 | sed -n "1~2p"
1
3
5
7
9
[[email protected] zcl]# 

指令表明:seq命令能够转移从1到10的数字类别

指令表达:上边的授命首要表达特殊符号“~”的功效,别的sed命令用法n和p请见后文详解,我们只必要精晓那个命令可以将“1~2”钦赐的行展现出来即可。

只要我们想生成奇数数列,其实上边的方式是为了举例,并不是三个很好的方法,因为seq命令自带那种功用。

[[email protected] zcl]# seq 1 2 10
1
3
5
7
9
[[email protected] zcl]# 

一声令下表明:seq命令格式seq开端值 公差 甘休值

[[email protected] zcl]# sed "1~2d" zcl.txt
102,alex,bb
104,laonanhai,dd
[[email protected] zcl]# sed "1,+2d" zcl.txt
104,laonanhai,dd
[[email protected] zcl]# 

命令说明:“1~2”这是钦命行数的另一种格式,从第2行开始以大幅2递增的行(1,3,5),因而删掉第①,3,5行,即具有的奇数行。

一声令下表明:那实在是做个加法运算,‘1,+2d’==>删除第贰行到第③(1+2)行的文件。

[[email protected] zcl]# sed '2,3!d' zcl.txt
102,alex,bb
103,eric,cc
[[email protected] zcl]# 

命令表明:在地点范围“2,3”前边加上“ !”,如若不加“!”表示删除第二行和第二行,结果如上边包车型大巴事例所示,然后加上“!”的结果正是除了第③行和第一行以外的始末都剔除,这么些措施能够用作显示文件的第③,3行难题的增补措施。

 

特殊符号~(步长)解析

格式:“First~step”表示从开首,以大幅度step递增,那些在数学中称之为等差数列

例子:

  • 1~2
    匹配1,3,5,7…..#–>用于只输出奇书行,大伙仔细观望一下种种数字的差值。
  • 2~2 匹配2,4,6,8….#–>用于只输出偶数行
  • 1~3 匹配1,4,7,10…..
  • 2~3 匹配2,5,8,11…..

    [root@chengliang zcl]# seq 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@chengliang zcl]# seq 10 | sed -n “1~2p”
    1
    3
    5
    7
    9
    [root@chengliang zcl]#

指令表达:seq命令能够生成从1到10的数字类别

命令表明:上面包车型大巴下令主要说明特殊符号“~”的效益,别的sed命令用法n和p请见后文详解,大家只要求明白这些命令能够将“1~2”钦定的行展现出来即可。

假定我们想生成奇数数列,其实上边的点子是为着举例,并不是三个很好的主意,因为seq命令自带那种效果。

[root@chengliang zcl]# seq 1 2 10
1
3
5
7
9
[root@chengliang zcl]# 

指令表明:seq命令格式seq初始值 公差
停止值

[root@chengliang zcl]# sed "1~2d" zcl.txt
102,alex,bb
104,laonanhai,dd
[root@chengliang zcl]# sed "1,+2d" zcl.txt
104,laonanhai,dd
[root@chengliang zcl]# 

一声令下表明:“1~2”那是钦赐行数的另一种格式,从第壹行起首以大幅2递增的行(1,3,5),因而删掉第②,3,5行,即全数的奇数行。

指令表达:那实际上是做个加法运算,‘1,+2d’==>删除第壹行到第一(1+2)行的文本。

[root@chengliang zcl]# sed '2,3!d' zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

一声令下表明:在地点范围“2,3”后边加上“
!”,假如不加“!”表示删除第②行和第叁行,结果如下边包车型大巴例证所示,然后加上“!”的结果正是除了第1行和第③行以外的情节都剔除,那么些方法能够当作显示文件的第二,3行难点的增加补充方法。

 

6.2.1.2 引号的分别总计

在教学进程中,有同学问小编在sed中毕竟使用单引号照旧双引号?那里给大家详细说说引号的界别。

  1. 双引号:把双引号的始末输出出来;假若情节中有发号施令,变量等,会先把命令,变量解析出结果,然后再出口最后内容来。双引号内命令或变量的写法为`一声令下或变量`或$(命令或变量)
  2. 单引号:所见即所得,将单引号内的剧情原样输出,阻止全部字符的转义
  3. 不加引号:不会将涵盖空格的字符串视为二个完好出口,借使情节中有发号施令,变量等,会先把命令,变量解析出结果,然后再出口最后内容来,假若字符串含有空格等特殊字符,则无法完整输出,则需改加双引号。
  4. 倒引号(反引号Esc键下方):举办指令的替换,在倒引号内部的shell命令将会被实施,其结果输出代替用倒引号括起来的公文。

Sed为什么用单引号?

[root@chensiqi1 ~]# cat person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed '2i $PATH' person.txt  #单引号--文本内容原封不动插入
101,chensiqi,CEO
$PATH
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed 2i $PATH person.txt   #不加引号,linux无法辨认空格,不会把有空格的命令当成一条命令来执行
sed: -e expression #1, char 2: expected \ after `a', `c' or `i'
[root@chensiqi1 ~]# sed "2i $PATH" person.txt #双引号--变量$PATH被解析以后在当作文本进行插入
101,chensiqi,CEO
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

结论一:

  • 如若引号里面是日常字符串的话,你能够随心所欲使用单引号只怕双引号:
  • 要是引号里面是变量可能带反引号的一声令下的话,你想要变量解析的结果依旧命令执行的结果,那就接纳双引号;你想要引号内的真容字符串,那就使用单引号。
  • 假若大家通晓地点的用法,领悟自个儿想要什么,那么您想用什么引号就用哪些引号。
  • 实则就二选一,非此即彼,那一个充裕就试试这一个。

结论二:

  1. 无数时候,计算的结论未必适合全数情状。可是,计算小结论,便于大家上学文化和对文化的深入领悟,因而推荐大家多做总括。
  2. 并非太纠结于结论,结论终归不是真理,只是大家上学进度的产物。就好像数学里的平行线一样,在初级中学定义便是不相交的两条直线便是平行线,到了高中结论便是错的了。

按行替换,那么些意义用的很少,所以大家明白即可。那里运用的sed命令是:
“c”:用新行取代旧行,纪念方法:c的全拼是change,意思是替换。

[root@chengliang zcl]# sed "2c wahaha" zcl.txt
101,chengliang,aa
wahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

一声令下表明:使用sed命令c将原本第3行 “102,alex,bb” 替换到“wahaha” ,
整行替换

 

按行替换,那几个成功用的很少,所以大家探听即可。那里运用的sed命令是:
“c”:用新行取代旧行,回想方法:c的全拼是change,意思是替换。

[[email protected] zcl]# sed "2c wahaha" zcl.txt
101,chengliang,aa
wahaha
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

指令表明:使用sed命令c将本来第①行
“102,alex,bb” 替换到“wahaha” ,
整行替换

 

按行替换,这么些功用用的很少,所以我们精通即可。这里运用的sed命令是:
“c”:用新行取代旧行,回想方法:c的全拼是change,意思是替换。

[root@chengliang zcl]# sed "2c wahaha" zcl.txt
101,chengliang,aa
wahaha
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令表达:使用sed命令c将原本第3行 “102,alex,bb” 替换到“wahaha” ,
整行替换

 

6.2.1.3 多行增

面前学习的内容早已落到实处了往文件扩充或插队单行文本,然而还有插入多行文本的需要,大家也学习过cat命令可未来文件中扩大多行文本。

以身作则准备,请执行如下完整命令生成test.txt文件内容:

[root@chensiqi1 ~]# cat > test.txt <<EOF
> welcome to my blog.http://www.cnblogs.com/chensiqiqi/
> 
> if you like my blog\'s contents,pls support me.
> 
> 
> 
> bye!boys and girls.
> EOF
命令说明:以上就是cat的生产环境常用的生成或为文件追加内容的方法,请不要忽略上文中的空行。另外,如果内容中有单引号,$符号等特殊符号作为内容时要用“\”转义。

如上命令执行进程及结果:

[root@chensiqi1 ~]# cat > test.txt <<EOF

> welcome to my blog.http://www.cnblogs.com/chensiqiqi/
> #此行是空行
> if you like my blog\'s contents,pls support me.
> #此行是空行
> #此行是空行
> #此行是空行
> bye!boys and girls.
> EOF #-->这里要敲回车才能结束,另外,EOF必须成对出现,但也可以用别的成对标签替换,例如:chensiqi字符标签。
命令说明:上面命令结果最左侧的“>”是Linux系统自动生成的,不是我们手动敲的。
  • ok,大家前边早已不难的回忆了cat命令的用法,假如我们想详细理解cat命令的详细用法,请持续关心作者的博客。
  • 前方我们兑现了用cat命令往文件中追加多行文本,但是cat命令和echo命令有相同的弱点,只好是往文末添加内容,并不可见在钦赐行操作,由此依然须求大家的sed命令出马。
  • 第③大家必要精晓多少个特殊符号“\n”,这几个符号叫做换行符,顾名思义换行。大家看多少个例子来认识一下以此标记。
[root@chensiqi1 ~]# echo "chensiqi";echo "chensiqi"
chensiqi
chensiqi

命令说明:上面的命令用分号“;”连接了两条命令,然后输出结果为2行chensiqi,但是有没有更简单的方法呢?
[root@chensiqi1 ~]# echo -e "chensiqi\nchensiqi"
chensiqi
chensiqi
命令说明:这里就“\n”派上用场了,行与行之间是以“\n”作为分隔符的,所以“chensiqi\nchensiqi”就等效于2行chensiqi。接下来我们用echo命令实验一下,其中-e参数表示字符串中如果出现以下特殊字符(\n代表换行,\t代表Tab键等),则加以特殊处理,而不会将它当成一般文字输出。如果大家想详细了解echo命令的详细用法,请持续关注我的博客。

学学完换行符,大家来看一下sed命令如何使用

[root@chensiqi1 ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
106,dandan,CSO  #同时追加多行
107,bingbing,CCO  #同时追加多行
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

命令行分析:

  • 我们率先粗略扫一眼这些命令语句,能够窥见命令结构是和单行扩充文本是差不离一贯不区分的。
  • 接下来我们看一下发令的结果,大家得以看看原来的第三行“102,zhangyang,CTO”前边扩充了2行文书“106,dandan,CSO”和“107,bingbing,CCO”。
  • 接下去我们解读一下sed语句的构造,sed软件打头,然后接上空格,在空格前边,我们先敲上一对单引号(“),然后退一格在单引号中写上‘2a
    106,dandan,CSO\n107,bingbing,CCO’。
  1. 2代表内定对第①行操作,其他的行忽略;
  2. a代表追加的情致,2a即在第②行后扩展文本;
  3. 2a背后加上空格,然后跟上你想要插入的多行文本即可。那里的每行文本使用“\n”连接就能够写成一行了。

澳门金沙国际 7
终极接上你想要处理的文书person.txt

本来还有其它一种形式添加多行文本,但那种方式并不曾“\n”方便,所以在那里就总结说一下。那种办法运用了“”,它也有换行的情致。要是我们在进行一行很短的命令时候,如若都写在一行,那太掉价了也不便精通,由此就动用到了那么些标记能够将一条完整的一声令下分成多行,举个例子:

[root@chensiqi1 ~]# echo chensiqi
chensiqi
[root@chensiqi1 ~]# echo \
> chensiqi
chensiqi
[root@chensiqi1 ~]# echo \ 
> chensiqi \
> is \
> me
chensiqi is me

命令说明:一条命令可以通过\符号进行多行输出

进而说一下sed命令使用反斜线,首先输入完“sed ‘2a 106,dandan,CSO
”,然后敲回车键,那样窗口会显得2个标志“>”,大家在这么些标记前边随着写命令的结余部分“107,bingbing,CCO‘
person.txt”。

[root@chensiqi1 ~]# sed '2a 106,dandan,CSO \ 
> 107,bingibng,CCO' \  
> person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
106,dandan,CSO 
107,bingibng,CCO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
命令说明:结果和第一种方法是一样的,但是我们也发现这种方法比较麻烦,因此建议大家使用第一种方法。
  • sed软件使用命令i插入多行文本和指令和a的用法是相同的,因而那里不再详细列出,大家能够演练一下,正是把前面命令的“a”换到“i”。
  • 学学了那般多内容,总要有用武之地,因而大家不用看答案先独自形成上边的信用合作社案例!

供销合作社案例1:优化SSH配置(一键完成增添多少参数

在大家学习CentOS6系统优化时,有叁个优化点:更改ssh服务远程登录的布置。首要的操作是在ssh的配置文件/etc/ssh/sshd_config到场上边5行文本。(下边参数的有血有肉意思见别的学科。)

Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

理所当然大家得以采纳vi/vim命令编辑这几个文件,不过如此就相比麻烦,未来想用一条命令扩充5行文本到第33行前?
专注:修改前别忘了备份配置文件:cp /etc/ssh/sshd_config{,.bak}
地点的命令知识假诺不懂请看通配符章节

这道集团面试题能够用大家学过的sed命令多行追加功用就足以解决。

[root@chensiqi1 ~]# sed -i '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“\n”就可以变成一行了。
上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。
[root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

命令说明:查看增加的文本内容,选项-n与命令p的具体用法见后文的6.2.4查。

文本替换

有工作经验的同室应该分外的耳熟能详,因为使用sed软件五分四的光景就是应用替换效用。

那边运用的sed命令,选项:(首要)

  • “s”:单独采用–>将每一行中第叁处匹配的字符串举办轮换==>sed命令
  • “g”:每一行开始展览一切轮换–>sed命令s的替换标志之一(全局替换),非sed命令。
  • “-i”:修改文件内容–>sed软件的选项,注意和sed命令i分裂。

sed软件替换模型  ===>  sed -i
‘s#对象内容#轮换内容#g’

  • 定界符/或#,第一个和第三个里面包车型大巴正是被替换的始末,第①个和第多少个之间的就是替换后的情节。提议大家使用#用作定界符。
  • 澳门金沙国际,s#指标内容#轮换内容#g ,“指标内容”能用正则表明式,但替换内容不可能用,必须是现实的。因为替换内容使用正则的话会让sed软件心慌意乱,它不领悟您要替换什么内容。
  • 暗中认可sed软件是对情势空间(内部存款和储蓄器中的数码)操作,而-i选项会转移磁盘上的文书内容。

结果为第贰行的“bb”替换为“i am
bb”。

[root@chengliang zcl]# sed "s#bb#i am bb#g" zcl.txt              
101,chengliang,aa
102,alex,i am bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

[root@chensiqi1 ~]# sed -i ‘s#zhangyang#dandan#g’ person.txt

命令表达:假设想的确的改动文件内容,大家就要求运用选拔“-i”。同时我们得以窥见命令执行后的结果是未曾其余输出的。

 

文件替换

有工作经验的同学应该格外的熟习,因为运用sed软件十分之八的气象正是采取替换功能。

这里运用的sed命令,选项:(首要)

  • “s”:单独使用–>将每一行中率先处匹配的字符串举办调换==>sed命令
  • “g”:每一行进行一切轮换–>sed命令s的替换标志之一(全局替换),非sed命令。
  • “-i”:修改文件内容–>sed软件的选项,注意和sed命令i不同。

sed软件替换模型  ===>  sed -i ‘s#指标内容#轮换内容#g’

  • 定界符/或#,第②个和第2个之间的正是被沟通的始末,第二个和第多个以内的正是替换后的剧情。建议我们利用#用作定界符。
  • s#对象内容#轮换内容#g
    ,“指标内容”能用正则表明式,但替换内容不能够用,必须是现实性的。因为替换内容使用正则的话会让sed软件不知道该咋办,它不晓得你要替换什么内容。
  • 暗中认可sed软件是对形式空间(内部存款和储蓄器中的数额)操作,而-i选项会变动磁盘上的文书内容。

结果为第叁行的“bb”替换为“i am bb”。

[[email protected] zcl]# sed "s#bb#i am bb#g" zcl.txt              
101,chengliang,aa
102,alex,i am bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

[[email protected]
~]# sed -i ‘s#zhangyang#dandan#g’
person.txt

指令表明:假诺想的确的修改文件内容,我们就须要选用选取“-i”。同时我们能够窥见命令执行后的结果是从未别的输出的。

 

文件替换

有工作经历的同桌应该特其他熟知,因为运用sed软件五分四的气象就是行使替换作用。

此处运用的sed命令,选项:(首要)

  • “s”:单独选取–>将每一行中首先处匹配的字符串举行轮换==>sed命令
  • “g”:每一行开展总体替换–>sed命令s的交替标志之一(全局替换),非sed命令。
  • “-i”:修改文件内容–>sed软件的选项,注意和sed命令i差异。

sed软件替换模型  ===>  sed -i
‘s#对象内容#轮换内容#g’

  • 定界符/或#,第②个和第贰个以内的就是被调换的始末,第②个和第七个之间的就是替换后的剧情。提议大家利用#用作定界符。
  • s#目的内容#轮换内容#g ,“目的内容”能用正则表达式,但替换内容无法用,必须是切实的。因为替换内容使用正则的话会让sed软件不知道该怎么做,它不明了你要替换什么内容。
  • 暗中认可sed软件是对方式空间(内部存款和储蓄器中的数目)操作,而-i选项会转移磁盘上的文本内容。

结果为第叁行的“bb”替换为“i am
bb”。

[root@chengliang zcl]# sed "s#bb#i am bb#g" zcl.txt              
101,chengliang,aa
102,alex,i am bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

[root@chensiqi1 ~]# sed -i ‘s#zhangyang#dandan#g’ person.txt

指令表达:假设想实在的改动文件内容,大家就须要选拔接纳“-i”。同时大家得以窥见命令执行后的结果是绝非别的输出的。

 

6.2.2 删

  • 近来给大家演示了第叁招,是或不是很好用。要是没看懂,请再看叁遍。假使学会了,那就随之小编来学习第三招—>删除钦赐行文本。
  • 那个成效也是丰裕得有用,比如我们想删除文件中的某个行,之前最常用的是vi或vim命令,但方今大家知道了sed命令,就应当采纳那个高逼格的授命完结职务了。
  • 此间大家须要用到三个sed命令;
  • “d”:删除文本,记念方法:d的全拼是delete,意思是去除。
  • 因为除去功用相比不难,由此我们构成地点范围一起验证。我们近期学过sed命令能够对一行文本为对象实行拍卖(在单行前后扩大一行或多行文本),接下去我们看一下哪些对多行文本为对象操作。

专营商案例2:内定行修改配置文件

[root@chengliang zcl]# sed "3s#0#9#" zcl.txt
101,chengliang,aa
102,alex,bb
193,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

一声令下表达:
后边学习的事例在sed命令“s”前并未点名地点范围,由此默许是对负有行进行操作。
而那一个案例要求只将第1行的0换到9,那里就用到了大家前边学过的地点范围知识,在sed命令“s”前增进“3”就代表对第壹行举行轮换

 

商行案例2:钦点行修改配置文件

[[email protected] zcl]# sed "3s#0#9#" zcl.txt
101,chengliang,aa
102,alex,bb
193,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

指令表达:
前边学习的例证在sed命令“s”前没有点名地点范围,由此私下认可是对拥有行实行操作。
而这一个案例须求只将第三行的0换来9,那里就用到了大家前边学过的地址范围知识,在sed命令“s”前增进“3”就表示对第2行开始展览轮换

 

店铺案例2:钦点行修改配置文件

[root@chengliang zcl]# sed "3s#0#9#" zcl.txt
101,chengliang,aa
102,alex,bb
193,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

指令表达:
前面学习的例证在sed命令“s”前并未点名地点范围,由此默许是对持有行开始展览操作。
而这么些案例供给只将第贰行的0换到9,那里就用到了我们前边学过的地点范围知识,在sed命令“s”前增加“3”就代表对第壹行实行替换

 

6.2.2.1钦点执行的地点范围

sed软件能够对单行或多行文本举行拍卖。假设在sed命令后面不点名地点范围,那么暗许会同盟全数行。
用法:n1[,n2]{sed -commands}
地址用逗号分隔绝,n1,n2能够用数字,正则表明式,大概两者的结合代表。

地址范围 含义
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7…..行操作
10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/chensiqi/{sed-commands} 对匹配chensiqi的行操作
/chensiqi/,/Alex/{sed-commands} 对匹配chensiqi的行到匹配Alex的行操作
/chensiqi/,${sed-commands} 对匹配chensiqi的行到最后一行操作
/chensiqi/,10{sed-commands} 对匹配chensiqi的行到第10行操作,注意:如果前10行没有匹配到chensiqi,sed软件会显示10行以后的匹配chensiqi的行
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/chensiqi/,+2{sed-commands} 对匹配chensiqi的行到其后的2行操作

上边用实际的例证演示一下,测试文件恐怕person.txt

[root@chensiqi1 ~]# sed 'd' person.txt 
[root@chensiqi1 ~]# 

命令说明:如果在sed命令前面不指定地址范围,那么默认会匹配所有行,然后使用d命令删除功能就会删除这个文件的所有内容

澳门金沙国际 8

[root@chensiqi1 ~]# sed '2d' person.txt 
101,chensiqi,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:这个单行删除想必大家能理解,指定删除第2行的文本102,zhangyang,CTO

澳门金沙国际 9

[root@chensiqi1 ~]# sed '2,5d' person.txt 
101,chensiqi,CEO

命令说明:‘2,5d’指定删除第2行到第5行的内容,d代表删除操作。

澳门金沙国际 10

ok,上边大家尝试完了数字地址范围,接下去大家尝试一下正则表明式的地方范围,纵然说能够动用正则表明式,不过大家依旧习惯写出完整的匹配字符串,达到准确匹配的指标。

[root@chensiqi1 ~]# sed '/zhangyang/d' person.txt 
101,chensiqi,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:
    在sed软件中,使用正则的格式和awk一样,使用2个”/“包含指定的正则表达式,即“/正则表达式/”。

澳门金沙国际 11

自然也足以行使七个正则表达式,如下例所示。

[root@chensiqi1 ~]# sed '/chensiqi/,/Alex/d' person.txt 
104,yy,CFO
105,feixue,CIO

命令说明:这是正则表达式形式的多行删除,也是以逗号分隔2个地址,最后结果是删除包含“chensiqi”的行到包含“Alex”的行

澳门金沙国际 12

[root@chensiqi1 ~]# sed '3,$d' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO

命令说明:学过正则表达式后我们知道“$”代表行尾,但是在sed中就有一些变化了,“$”在sed中代表文件的最后一行。因此本例子的含义是删除第3行到最后一行的文本,包含第3行和最后一行,因此剩下第1,2行的内容。

澳门金沙国际 13

接下去大家看有的异样景况。

[root@chensiqi1 ~]# sed '/chensiqi/,3d' person.txt 
104,yy,CFO
105,feixue,CIO

命令说明:这个例子是删除包含“chensiqi”的行到第3行的内容。但这种组合有一个比较特殊的情况,如果前3行之外还有这个“chensiqi”字眼,sed软件还是会找他“麻烦”,请看下面例子。

[root@chensiqi1 ~]# sed '$a 106,chensiqi,CMO' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,chensiqi,CMO

命令说明:为了不造成同学们实验文本改来改去导致不同意,因此我用上面的命令语句只是临时修改内存数据,然后通过管道符号传给sed软件。

[root@chensiqi1 ~]# sed '$a 106,chensiqi,CMO' person.txt | sed '/chensiqi/,3d'
104,yy,CFO
105,feixue,CIO

命令说明:从命令结果我们可以看到,不仅是第1行(101,chensiqi,CEO)到第3行(103,ALex,COO)被删除了,而且最后一行(106,chensiqi,CMO)也被删除了。因此我们可以得出一个小结论,sed软件使用正则表达式会找出所有匹配的行,即使是有数字地址限制。

再来看2个独特别情报况。

[root@chensiqi1 ~]# sed '2,/O/d' person.txt 
101,chensiqi,CEO
104,yy,CFO
105,feixue,CIO

命令说明:
    从第2行开始删除到含字母O的行结束,但是我们发现第3,4,5行都含有字母O,命令结果显示只删除了第2,3行,属于最短删除。这个怎么理解?
    还是可以从上面命令执行流程图理解,从第2行开始循环,sed软件第一次遇到字母O(第三行)就认为循环结束了。
[root@chensiqi1 ~]# sed '2,/o/d' person.txt 
101,chensiqi,CEO

命令说明:
    从第2行开始删除,但是后面文本没有字母O,因此一直循环下去,直到文本结束,sed软件自动终止。

世家看完上面包车型大巴例子是否一脸懵逼,其实非常的粗略。在工作中大家最常用的恐怕数字地址这种精确匹配方式,像上边的正则地址或混合地址这种歪曲匹配用的可比少,通晓即可。

变量替换

变量替换其实和前面包车型地铁文书替换是一致的,便是具体的文本变成了变量,同时供给大家对引号的用法要有清晰的了然.

[root@chengliang zcl]# cat > person.txt<<KOF 
> a
> b
> a
> KOF
[root@chengliang zcl]# cat person.txt
a
b
a
[root@chengliang zcl]# x=a
[root@chengliang zcl]# y=b
[root@chengliang zcl]# echo $x    ##-->设置变量x并 赋值a
a
[root@chengliang zcl]# echo $b

[root@chengliang zcl]# echo $y
b
[root@chengliang zcl]# 

不采纳引号

[root@chengliang zcl]# sed s#$x#$y#g person.txt
b
b
b
[root@chengliang zcl]# sed 's#'$x'#'$y'#g' person.txt
b
b
b
[root@chengliang zcl]# sed 's#$x#$y#g' person.txt
a
b
a
[root@chengliang zcl]#
命令说明:表面看起来单引号是可以用的,但其实这里用了障眼法,在你们眼中分段‘$x’和'$y',但其实分段是‘s#’和‘#’和‘#g’,所以$x和$y并没有被引号扩起来,和上面的例子就一样了。

使用eval命令:

[root@chengliang zcl]# sed 's#$x#$y#g' person.txt  
a
b
a
[root@chengliang zcl]# eval sed 's#$x#$y#g' person.txt  
b
b
b
[root@chengliang zcl]# 

一声令下表明:那里给大家扩张三个Linux内置命令eval,那个命令能读入变量,并将他们组合成多个新的授命,然后实施。首先eval会解析变量$x和变量$y,最终完结的功效和双引号是平等的

拓展: 最便捷的拿走IP地址的方式

[root@chengliang zcl]# hostname -I 
192.168.179.133 
[root@chengliang zcl]# 

 

变量替换

变量替换其实和后面包车型大巴文件替换是一致的,就是具体的文书变成了变量,同时需要我们对引号的用法要有旁观者清的驾驭.

[[email protected] zcl]# cat > person.txt<<KOF 
> a
> b
> a
> KOF
[[email protected] zcl]# cat person.txt
a
b
a
[[email protected] zcl]# x=a
[[email protected] zcl]# y=b
[[email protected] zcl]# echo $x    ##-->设置变量x并 赋值a
a
[[email protected] zcl]# echo $b

[[email protected] zcl]# echo $y
b
[[email protected] zcl]# 

不行使引号

[[email protected] zcl]# sed s#$x#$y#g person.txt
b
b
b
[[email protected] zcl]# sed 's#'$x'#'$y'#g' person.txt
b
b
b
[[email protected] zcl]# sed 's#$x#$y#g' person.txt
a
b
a
[[email protected] zcl]#
命令说明:表面看起来单引号是可以用的,但其实这里用了障眼法,在你们眼中分段‘$x’和'$y',但其实分段是‘s#’和‘#’和‘#g’,所以$x和$y并没有被引号扩起来,和上面的例子就一样了。

使用eval命令:

[[email protected] zcl]# sed 's#$x#$y#g' person.txt  
a
b
a
[[email protected] zcl]# eval sed 's#$x#$y#g' person.txt  
b
b
b
[[email protected] zcl]# 

指令表明:那里给大家扩大一个Linux内置命令eval,这几个命令能读入变量,并将他们组合成一个新的下令,然后实施。首先eval会解析变量$x和变量$y,最终达到的效应和双引号是一模一样的

拓展: 最快速的取得IP地址的办法

[[email protected] zcl]# hostname -I 
192.168.179.133 
[[email protected] zcl]# 

 

变量替换

变量替换其实和眼下的文本替换是一样的,正是现实的公文变成了变量,同时供给大家对引号的用法要有清晰的理解.

[root@chengliang zcl]# cat > person.txt<<KOF 
> a
> b
> a
> KOF
[root@chengliang zcl]# cat person.txt
a
b
a
[root@chengliang zcl]# x=a
[root@chengliang zcl]# y=b
[root@chengliang zcl]# echo $x    ##-->设置变量x并 赋值a
a
[root@chengliang zcl]# echo $b

[root@chengliang zcl]# echo $y
b
[root@chengliang zcl]# 

不采用引号

[root@chengliang zcl]# sed s#$x#$y#g person.txt
b
b
b
[root@chengliang zcl]# sed 's#'$x'#'$y'#g' person.txt
b
b
b
[root@chengliang zcl]# sed 's#$x#$y#g' person.txt
a
b
a
[root@chengliang zcl]#
命令说明:表面看起来单引号是可以用的,但其实这里用了障眼法,在你们眼中分段‘$x’和'$y',但其实分段是‘s#’和‘#’和‘#g’,所以$x和$y并没有被引号扩起来,和上面的例子就一样了。

使用eval命令:

[root@chengliang zcl]# sed 's#$x#$y#g' person.txt  
a
b
a
[root@chengliang zcl]# eval sed 's#$x#$y#g' person.txt  
b
b
b
[root@chengliang zcl]# 

一声令下表明:那里给大家扩大二个Linux内置命令eval,这些命令能读入变量,并将她们组合成2个新的下令,然后实施。首先eval会解析变量$x和变量$y,最终达到的效率和双引号是如出一辙的

拓展: 最高效的收获IP地址的法门

[root@chengliang zcl]# hostname -I 
192.168.179.133 
[root@chengliang zcl]# 

 

6.2.2.2 特殊符号~(步长)解析

格式:“First~step”表示从早先,以小幅step递增,那几个在数学中称之为等差数列

例子:

  • 1~2
    匹配1,3,5,7…..#–>用于只输出奇书行,大伙仔细察看一下种种数字的差值。
  • 2~2 匹配2,4,6,8….#–>用于只输出偶数行
  • 1~3 匹配1,4,7,10…..
  • 2~3 匹配2,5,8,11…..

[root@chensiqi1 ~]# seq 10
1
2
3
4
5
6
7
8
9
10

命令说明:seq命令能够生成从1到10的数字序列。

[root@chensiqi1 ~]# seq 10 | sed -n '1~2p'
1
3
5
7
9

命令说明:
    上面的命令主要验证特殊符号“~”的效果,其他sed命令用法n和p请见后文详解,大家只需要知道这个命令可以将“1~2”指定的行显示出来即可。
    上面例子测试了“1~2”的效果,大家也可以手动测试一下“2~2”,“1~3”,“2~3”,看一下他们的结果是不是符合等差数列。

填补小知识:

固然大家想生成奇数数列,其实上边的艺术是为了举例,并不是三个很好的情势,因为seq命令自带那种成效。

[root@chensiqi1 ~]# seq 1 2 10
1
3
5
7
9

命令说明:seq命令格式seq起始值 公差 结束值

再来一例:

[root@chensiqi1 ~]# sed '1~2d' person.txt 
102,zhangyang,CTO
104,yy,CFO

命令说明:“1~2”这是指定行数的另一种格式,从第1行开始以步长2递增的行(1,3,5),因此删掉第1,3,5行,即所有的奇数行。

分组替换()和\1的利用验证

sed软件的()的意义能够记住正则表明式的一片段,个中, style=”color: #ff0000;”>\1为第二个牢记的情势即首先个小括号中的匹配内容,\2回之个牢记的方式,即第一个小括号中的匹配内容,sed最多能够记住玖个。

例:echo “I am chensiqi teacher.”
 要是想保留这一行的单词chengliang,删除剩下部分,使用圆括号标记想保留的某个。

[root@chengliang zcl]# echo "I am chengliang student." | sed 's#^.*am \([a-z]\+\) stu.*$#\1#g' 
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#^.*am ([a-z]+) stu.*$#\1#g'   
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1#g'                   
am
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1\2#g'
amchengliang
[root@chengliang zcl]# 

再来看个难题:请执行命令取出linux中的eth0的IP地址?

[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p'
          inet addr:192.168.197.133  Bcast:192.168.197.255  Mask:255.255.255.0
[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'
192.168.197.133

也可以进行组合

[root@chensiqi1 ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'
192.168.197.133 

命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

 

分组替换()和\1的运用表达

sed软件的()的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二个记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

例:echo “I am chensiqi teacher.”
 假诺想保留这一行的单词chengliang,删除剩下部分,使用圆括号标记想保留的有个别。

[[email protected] zcl]# echo "I am chengliang student." | sed 's#^.*am \([a-z]\+\) stu.*$#\1#g' 
chengliang
[[email protected] zcl]# echo "I am chengliang student." | sed -r 's#^.*am ([a-z]+) stu.*$#\1#g'   
chengliang
[[email protected] zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1#g'                   
am
[[email protected] zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1\2#g'
amchengliang
[[email protected] zcl]# 

再来看个难点:请执行命令取出linux中的eth0的IP地址?

[[email protected] ~]# ifconfig eth0 | sed -n '2p'
          inet addr:192.168.197.133  Bcast:192.168.197.255  Mask:255.255.255.0
[[email protected] ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'
192.168.197.133

也可以进行组合

[[email protected] ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'
192.168.197.133 

命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

 

分组替换()和\1的使用验证

sed软件的()的功用能够记住正则表明式的一有的,个中, style=”color: #ff0000;”>\1为率先个难忘的情势即首先个小括号中的匹配内容,\2回之个难忘的方式,即第二个小括号中的匹配内容,sed最多能够记住几个。

例:echo “I am chensiqi teacher.”
 要是想保留这一行的单词chengliang,删除剩下部分,使用圆括号标记想保留的一对。

[root@chengliang zcl]# echo "I am chengliang student." | sed 's#^.*am \([a-z]\+\) stu.*$#\1#g' 
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#^.*am ([a-z]+) stu.*$#\1#g'   
chengliang
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1#g'                   
am
[root@chengliang zcl]# echo "I am chengliang student." | sed -r 's#I (.*) (.*) stu.*$#\1\2#g'
amchengliang
[root@chengliang zcl]# 

再来看个难题:请执行命令取出linux中的eth0的IP地址?

[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p'
          inet addr:192.168.197.133  Bcast:192.168.197.255  Mask:255.255.255.0
[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'
192.168.197.133

也可以进行组合

[root@chensiqi1 ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'
192.168.197.133 

命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

 

6.2.2.3 特殊符号+解析
[root@chensiqi1 ~]# sed '1,+2d' person.txt  
104,yy,CFO
105,feixue,CIO

命令说明:这其实是做个加法运算,‘1,+2d’==>删除第1行到第3(1+2)行的文本。

上面是特殊符号“+”的用法,大家领悟即可。

特殊符号&代表被沟通的始末

那是一个异样技能,在符合的情景使用尤其福利。上边用特殊符号“&”与分组替换一起使用,举办相比较。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -r 's#(.*),(.*),(.*)#& ----- \1 \2 \3#' zcl.txt 
101,chengliang,aa ----- 101 chengliang aa
102,alex,bb ----- 102 alex bb
103,eric,cc ----- 103 eric cc
104,laonanhai,dd ----- 104 laonanhai dd
[root@chengliang zcl]# 

地点命令的&符号代表每一行,即模型中‘s#目的内容#轮换内容#g’的靶子内容。

 

特殊符号&代表被替换的剧情

这是贰个特有技能,在适合的气象使用专门便利。下边用特殊符号“&”与分组替换一起利用,实行对照。

[[email protected] zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed -r 's#(.*),(.*),(.*)#& ----- \1 \2 \3#' zcl.txt 
101,chengliang,aa ----- 101 chengliang aa
102,alex,bb ----- 102 alex bb
103,eric,cc ----- 103 eric cc
104,laonanhai,dd ----- 104 laonanhai dd
[[email protected] zcl]# 

上边命令的&符号代表每一行,即模型中‘s#目的内容#轮换内容#g’的对象内容。

 

特殊符号&代表被沟通的内容

那是2个特有技能,在符合的景况使用专门福利。上边用特殊符号“&”与分组替换一起行使,实行自己检查自纠。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -r 's#(.*),(.*),(.*)#& ----- \1 \2 \3#' zcl.txt 
101,chengliang,aa ----- 101 chengliang aa
102,alex,bb ----- 102 alex bb
103,eric,cc ----- 103 eric cc
104,laonanhai,dd ----- 104 laonanhai dd
[root@chengliang zcl]# 

地点命令的&符号代表每一行,即模型中‘s#对象内容#轮换内容#g’的目的内容。

 

6.2.2.4 特殊符号!解析

感慨号“!”我们在重重下令里都接触过,大多数都是取反的意趣,在sed中也不例外。

[root@chensiqi1 ~]# sed '2,3!d' person.txt 
102,zhangyang,CTO
103,Alex,COO

命令说明:在地址范围“2,3”后面加上“
!”,如果不加“!”表示删除第2行和第3行,结果如下面的例子所示,然后加上“!”的结果就是除了第2行和第3行以外的内容都删除,这个方法可以作为显示文件的第2,3行题目的补充方法。

[root@chensiqi1 ~]# sed '2,3d' person.txt 
101,chensiqi,CEO
104,yy,CFO
105,feixue,CIO

卖家案例2:打印文件内容但不分包chensiqi

那是同步集团面试题,很简短,就是把带有chensiqi字符串的行删除掉即可。大家得以用“grep
-v”取反获得咱们想要的结果,然则此间我们选取sed软件达成。

[root@chensiqi1 ~]# sed '/chensiqi/d' person.txt 
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:删除包含“chensiqi”的行,就直接用正则匹配字符串chensiqi即可

供销合作社案例3:批量重命名文件

当前目录下有文件如下所示:

[root@chengliang test_1]# find ./ -name "*_finished.jpg"
./stu_102999_4_finished.jpg
./stu_102999_1_finished.jpg
./stu_102999_5_finished.jpg
./stu_102999_3_finished.jpg
./stu_102999_2_finished.jpg
[root@chengliang test_1]#

要求用sed命令重命名,效果为:

stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished
mv - move (rename) files

解题思路:因为那是文件名,不能够直接yongsed命令替换,由此还亟需借助mv命令重命名

格式为:mv stu_102999_1_finished.jpg
stu_102999_1.jpg.
大家供给拼凑那样的格式,然后采纳bash命令执行即可。

[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#\1\2#g'
./stu_102999_4.jpg
./stu_102999_1.jpg
./stu_102999_5.jpg
./stu_102999_3.jpg
./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' 
mv ./stu_102999_4_finished.jpg ./stu_102999_4.jpg
mv ./stu_102999_1_finished.jpg ./stu_102999_1.jpg
mv ./stu_102999_5_finished.jpg ./stu_102999_5.jpg
mv ./stu_102999_3_finished.jpg ./stu_102999_3.jpg
mv ./stu_102999_2_finished.jpg ./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' | bash
[root@chengliang test_1]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg
[root@chengliang test_1]# 

一声令下表达:

  1. “\1”代表前边“(^.*)”匹配内容,“&”代表“s#
    #”里被调换的始末,那里极度到的是一体化的文件名。
  2. 接纳bash命令执行,bash命令执行规范输入的话语,就像大家在命令行输入语句后敲回车。

 

信用社案例3:批量重命名文件

当前目录下有文件如下所示:

[[email protected] test_1]# find ./ -name "*_finished.jpg"
./stu_102999_4_finished.jpg
./stu_102999_1_finished.jpg
./stu_102999_5_finished.jpg
./stu_102999_3_finished.jpg
./stu_102999_2_finished.jpg
[[email protected] test_1]#

必要用sed命令重命名,效果为:

stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished
mv - move (rename) files

解题思路:因为这是文件名,不能够直接yongsed命令替换,因而还亟需借助mv命令重命名

格式为:mv stu_102999_1_finished.jpg stu_102999_1.jpg.
大家须要拼凑那样的格式,然后利用bash命令执行即可。

[[email protected] test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#\1\2#g'
./stu_102999_4.jpg
./stu_102999_1.jpg
./stu_102999_5.jpg
./stu_102999_3.jpg
./stu_102999_2.jpg
[[email protected] test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' 
mv ./stu_102999_4_finished.jpg ./stu_102999_4.jpg
mv ./stu_102999_1_finished.jpg ./stu_102999_1.jpg
mv ./stu_102999_5_finished.jpg ./stu_102999_5.jpg
mv ./stu_102999_3_finished.jpg ./stu_102999_3.jpg
mv ./stu_102999_2_finished.jpg ./stu_102999_2.jpg
[[email protected] test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' | bash
[[email protected] test_1]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg
[[email protected] test_1]# 

命令表达:

 

供销合作社案例3:批量重命名文件

当前目录下有文件如下所示:

[root@chengliang test_1]# find ./ -name "*_finished.jpg"
./stu_102999_4_finished.jpg
./stu_102999_1_finished.jpg
./stu_102999_5_finished.jpg
./stu_102999_3_finished.jpg
./stu_102999_2_finished.jpg
[root@chengliang test_1]#

需求用sed命令重命名,效果为:

stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished
mv - move (rename) files

解题思路:因为那是文件名,不能够直接yongsed命令替换,由此还索要借助mv命令重命名

格式为:mv stu_102999_1_finished.jpg
stu_102999_1.jpg.
我们须求拼凑那样的格式,然后选拔bash命令执行即可。

[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#\1\2#g'
./stu_102999_4.jpg
./stu_102999_1.jpg
./stu_102999_5.jpg
./stu_102999_3.jpg
./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' 
mv ./stu_102999_4_finished.jpg ./stu_102999_4.jpg
mv ./stu_102999_1_finished.jpg ./stu_102999_1.jpg
mv ./stu_102999_5_finished.jpg ./stu_102999_5.jpg
mv ./stu_102999_3_finished.jpg ./stu_102999_3.jpg
mv ./stu_102999_2_finished.jpg ./stu_102999_2.jpg
[root@chengliang test_1]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' | bash
[root@chengliang test_1]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg
[root@chengliang test_1]# 

一声令下表达:

  1. “\1”代表后面“(^.*)”匹配内容,“&”代表“s#
    #”里被替换的情节,那里优异到的是总体的文本名。
  2. 使用bash命令执行,bash命令执行正式输入的说话,仿佛我们在命令行输入语句后敲回车。

 

6.2.3 改

世家未来早已学完了sed软件2大招式,是还是不是十分棒!当然前面还有更决定的—>改.在求学linux时,大家最广大的操作便是改配置文件,改参数等等,而且更妙的是眼下大家上学过的增多和删除其实都得以用大家准备要学的修改变相完结。

笔者们想查看文件中的某个行,在此以前最常用的是cat或more或less命令等,但那一个命令有个别欠缺,正是不能够查看钦定的行。而我们用了很久的sed命令就有了这几个功用了。而且大家前边也说过使用sed比别的命令vim等读取速度更快!

“p”:输出钦点内容,但私下认可会输出2遍卓越的结果,由此选用-n选项撤消暗中同意输出,纪念方法:p的全拼是print,意思是打字与印刷。

按行查询

[root@chengliang zcl]# sed "2p" zcl.txt
101,chengliang,aa
102,alex,bb
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "2p" zcl.txt
102,alex,bb
[root@chengliang zcl]# 
命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chengliang zcl]# sed -n "2,3p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 
命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[root@chengliang zcl]# sed -n "1~2p" zcl.txt
101,chengliang,aa
103,eric,cc
命令说明:打印文件的1,3,5行。~代表步长

[root@chengliang zcl]# sed -n "p" zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 
命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[root@chengliang zcl]# sed -n "/alex/p" zcl.txt    ==>命令说明:打印含CTO的行
102,alex,bb
[root@chengliang zcl]# 
[root@chengliang zcl]# sed -n "/alex/,/chengliang/p" zcl.txt
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "/alex/,/eric/p" zcl.txt    ==>命令说明:打印含alex的行到含eric的行
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

错落查询

[root@chengliang zcl]# sed -n "2, /cc/p" zcl.txt
102,alex,bb
103,eric,cc
命令说明:打印第2行到含cc的行。

[root@chengliang zcl]# sed -n "/cc/,2p" zcl.txt
103,eric,cc
[root@chengliang zcl]# 
命令说明:特殊情况,前两行没有匹配到cc,就向后匹配,如果匹配到cc就打印此行。所以这种混合地址不推荐使用。

 过滤八个字符

[root@chengliang zcl]# sed -rn "/alex|cc/p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

命令表达: 使用扩展正则“|”,为了不行使转义符号“\”,由此使用-r选项开启扩大正则表明式格局

 

我们想查看文件中的某个行,在此之前最常用的是cat或more或less命令等,但那么些命令有个别欠缺,正是不可能查看钦命的行。而大家用了很久的sed命令就有了那么些效应了。而且大家眼下也说过使用sed比别的命令vim等读取速度更快!

“p”:输出钦点内容,但私下认可会输出2遍匹配的结果,因而采纳-n选项废除默许输出,回忆方法:p的全拼是print,意思是打字与印刷。

按行查询

[[email protected] zcl]# sed "2p" zcl.txt
101,chengliang,aa
102,alex,bb
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed -n "2p" zcl.txt
102,alex,bb
[[email protected] zcl]# 
命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[[email protected] zcl]# sed -n "2,3p" zcl.txt
102,alex,bb
103,eric,cc
[[email protected] zcl]# 
命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[[email protected] zcl]# sed -n "1~2p" zcl.txt
101,chengliang,aa
103,eric,cc
命令说明:打印文件的1,3,5行。~代表步长

[[email protected] zcl]# sed -n "p" zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 
命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[[email protected] zcl]# sed -n "/alex/p" zcl.txt    ==>命令说明:打印含CTO的行
102,alex,bb
[[email protected] zcl]# 
[[email protected] zcl]# sed -n "/alex/,/chengliang/p" zcl.txt
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# sed -n "/alex/,/eric/p" zcl.txt    ==>命令说明:打印含alex的行到含eric的行
102,alex,bb
103,eric,cc
[[email protected] zcl]# 

掺杂查询

[[email protected] zcl]# sed -n "2, /cc/p" zcl.txt
102,alex,bb
103,eric,cc
命令说明:打印第2行到含cc的行。

[[email protected] zcl]# sed -n "/cc/,2p" zcl.txt
103,eric,cc
[[email protected] zcl]# 
命令说明:特殊情况,前两行没有匹配到cc,就向后匹配,如果匹配到cc就打印此行。所以这种混合地址不推荐使用。

 过滤多少个字符

[[email protected] zcl]# sed -rn "/alex|cc/p" zcl.txt
102,alex,bb
103,eric,cc
[[email protected] zcl]# 

命令表达:
使用扩充正则“|”,为了不行使转义符号“\”,因而使用-r选项开启扩展正则表达式形式

 

咱俩想查看文件中的有个别行,以前最常用的是cat或more或less命令等,但这个命令有些欠缺,正是无法查看钦赐的行。而我们用了很久的sed命令就有了这一个功能了。而且大家日前也说过使用sed比别的命令vim等读取速度更快!

“p”:输出钦点内容,但默许会输出一回金童玉女的结果,因而选择-n选项撤废默许输出,回忆方法:p的全拼是print,意思是打字与印刷。

按行查询

[root@chengliang zcl]# sed "2p" zcl.txt
101,chengliang,aa
102,alex,bb
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "2p" zcl.txt
102,alex,bb
[root@chengliang zcl]# 
命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chengliang zcl]# sed -n "2,3p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 
命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[root@chengliang zcl]# sed -n "1~2p" zcl.txt
101,chengliang,aa
103,eric,cc
命令说明:打印文件的1,3,5行。~代表步长

[root@chengliang zcl]# sed -n "p" zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 
命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[root@chengliang zcl]# sed -n "/alex/p" zcl.txt    ==>命令说明:打印含CTO的行
102,alex,bb
[root@chengliang zcl]# 
[root@chengliang zcl]# sed -n "/alex/,/chengliang/p" zcl.txt
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "/alex/,/eric/p" zcl.txt    ==>命令说明:打印含alex的行到含eric的行
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

错落查询

[root@chengliang zcl]# sed -n "2, /cc/p" zcl.txt
102,alex,bb
103,eric,cc
命令说明:打印第2行到含cc的行。

[root@chengliang zcl]# sed -n "/cc/,2p" zcl.txt
103,eric,cc
[root@chengliang zcl]# 
命令说明:特殊情况,前两行没有匹配到cc,就向后匹配,如果匹配到cc就打印此行。所以这种混合地址不推荐使用。

 过滤多个字符

[root@chengliang zcl]# sed -rn "/alex|cc/p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

命令表达: 使用扩张正则“|”,为了不利用转义符号“\”,因而利用-r选项开启扩张正则表达式方式

 

6.2.3.1 按行替换

率先说一下按行替换,这些功功效的很少,所以大家精通即可。那里运用的sed命令是:
“c”:用新行取代旧行,回想方法:c的全拼是change,意思是替换。

例子:

[root@chensiqi1 ~]# sed '2c 106,dandan,CSO' person.txt 
101,chensiqi,CEO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:使用sed命令c将原来第2行“102,zhangyang,CTO”替换成“106,dandan,CSO”,整行替换

sed修改文件的同时进行备份

[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt
[root@chengliang zcl]# sed -i.bak "s#chengliang#Fuck#g" zcl.txt
[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt  zcl.txt.bak
[root@chengliang zcl]# cat zcl.txt
101,Fuck,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# cat zcl.txt.bak
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令行表达:
在-i参数的末端加上.bak(.任意字符),sed会对文件进行先备份后修改

 

sed修改文件的同时进行备份

[[email protected] zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt
[[email protected] zcl]# sed -i.bak "s#chengliang#Fuck#g" zcl.txt
[[email protected] zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt  zcl.txt.bak
[[email protected] zcl]# cat zcl.txt
101,Fuck,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# cat zcl.txt.bak
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

命令行表达:
在-i参数的背后加上.bak(.任意字符),sed会对文件进行先备份后修改

 

sed修改文件的同时展开备份

[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt
[root@chengliang zcl]# sed -i.bak "s#chengliang#Fuck#g" zcl.txt
[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt  zcl.txt.bak
[root@chengliang zcl]# cat zcl.txt
101,Fuck,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# cat zcl.txt.bak
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令行表达:
在-i参数的背后加上.bak(.任意字符),sed会对文本实行先备份后修改

 

6.2.3.2 文本替换
  • 采用来说的那一个职能,有工作经验的校友应该十分的熟练,因为使用sed软件五分之四的场景就是行使替换作用。
  • 此间运用的sed命令,选项:
    “s”:单独使用–>将每一行中率先处匹配的字符串举办沟通==>sed命令
    “g”:每一行举行一切轮换–>sed命令s的轮换标志之一(全局替换),非sed命令。
    “-i”:修改文件内容–>sed软件的选项,注意和sed命令i不相同。

sed软件替换模型

sed -i ‘s/目的内容/替换内容/g’ chensiqi.log
sed -i ‘s#对象内容#轮换内容#g’

观测特点

1,两边是引号,引号里面包车型客车两边分别为s和g,中间是四个一样的字符/或#用作定界符。字符#能在轮换内容包罗字符/有助于区分。定界符能够是任意字符如:或|等,但当替换内容蕴含定界符时,要求转义:或|.经过长时间实践,建议大家使用#作为定界符。
2,定界符/或#,第两个和第二个以内的便是被替换的剧情,第②个和第⑩个里头的就是替换后的始末。
3,s#目的内容#轮换内容#g
,“指标内容”能用正则表明式,但替换内容无法用,必须是现实的。因为替换内容使用正则的话会让sed软件手足无措,它不明白你要替换什么内容。
4,私下认可sed软件是对方式空间(内存中的多寡)操作,而-i选项会转移磁盘上的文书内容。

例子:

[root@chensiqi1 ~]# sed 's#zhangyang#dandan#g' person.txt 
101,chensiqi,CEO
102,dandan,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:将需要替换的文本“zhangyang”放在第一个和第二个“#”之间,将替换后的文本“dandan”放在第二个核第三个“#”之间。结果为第二行的“zhangyang”替换为“dandan”。

修改文件:

[root@chensiqi1 ~]# cat person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:从上面命令的结果我们就知道sed命令默认不会修改文件的内容

[root@chensiqi1 ~]# sed -i 's#zhangyang#dandan#g' person.txt

命令说明:如果想真正的修改文件内容,我们就需要使用选项“-i”,这个要和sed命令“i”区分开来。同时我们可以发现命令执行后的结果是没有任何输出的。

[root@chensiqi1 ~]# cat person.txt 
101,chensiqi,CEO
102,dandan,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:当我们再次查看这个文件时,我们就发现这个文件已经被修改成功了。因此大家以后如果使用替换功能时,应该首先不用选项“-i”测试一下,确保操作无误,最后使用“-i”修改文件

过来测试文件:

[root@chensiqi1 ~]# sed -i 's#dandan#zhangyang#g' person.txt

命令说明:还原测试文件,这一步大家不要忘了执行,不然后面就跟不上步骤了

商户案例3:钦赐行修改配置文件

前面大家学过的模型可以将文件中颇具满意条件的文书举办操作,可是大家也会遇到内定行标准修改配置文件的供给,因为如此能够免止予修业改多了地点。

[root@chensiqi1 ~]# sed '3s#0#9#' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
193,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:
    前面学习的例子在sed命令“s”前没有指定地址范围,因此默认是对所有行进行操作。
    而这个案例要求只将第3行的0换成9,这里就用到了我们前面学过的地址范围知识,在sed命令“s”前加上“3”就代表对第3行进行替换

特殊符号=获取行号

[root@chengliang zcl]# sed '=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
4
104,laonanhai,dd
命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。

[root@chengliang zcl]# sed '1,3=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
104,laonanhai,dd
命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容

[root@chengliang zcl]#
[root@chengliang zcl]# sed '/alex/=' zcl.txt
101,Fuck,aa
2
102,alex,bb
103,eric,cc
104,laonanhai,dd
命令说明:只打印正则匹配行的行号,同时输出文件中的内容

[root@chengliang zcl]# sed -n '/alex/=' zcl.txt
2
命令说明:只显示行号但不显示行的内容即取消默认输出

[root@chengliang zcl]# sed -n '$=' zcl.txt
4
[root@chengliang zcl]# 
命令说明:“$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

方法立异:

[root@chengliang zcl]# sed '=' zcl.txt | sed 'N;s#\n# #'      
1 101,Fuck,aa
2 102,alex,bb
3 103,eric,cc
4 104,laonanhai,dd
[root@chengliang zcl]# 

  

sed怎么着取不三番五次的行

[root@chengliang zcl]# sed -n "1p;3p;4p" zcl.txt
101,Fuck,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

特殊符号{}的采用

[root@chengliang zcl]# sed -n '2,3p;=' zcl.txt 
1
102,alex,bb
2
103,eric,cc
3
4
[root@chengliang zcl]# sed -n '2,3{p;=}' zcl.txt
102,alex,bb
2
103,eric,cc
3
[root@chengliang zcl]# 
  • 命令表明:-n去掉暗许输出,2,4p,输出2到4行内容,=输出全部的行的行号

  • 指令表明: ‘2,4{p;=}’代表统一输出2,4行的行号和剧情

 

参照博客:

 

特殊符号=获取行号

[[email protected] zcl]# sed '=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
4
104,laonanhai,dd
命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。

[[email protected] zcl]# sed '1,3=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
104,laonanhai,dd
命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容

[[email protected] zcl]#
[[email protected] zcl]# sed '/alex/=' zcl.txt
101,Fuck,aa
2
102,alex,bb
103,eric,cc
104,laonanhai,dd
命令说明:只打印正则匹配行的行号,同时输出文件中的内容

[[email protected] zcl]# sed -n '/alex/=' zcl.txt
2
命令说明:只显示行号但不显示行的内容即取消默认输出

[[email protected] zcl]# sed -n '$=' zcl.txt
4
[[email protected] zcl]# 
命令说明:“$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

办法立异:

[[email protected] zcl]# sed '=' zcl.txt | sed 'N;s#\n# #'      
1 101,Fuck,aa
2 102,alex,bb
3 103,eric,cc
4 104,laonanhai,dd
[[email protected] zcl]# 

  

sed如何取不总是的行

[[email protected] zcl]# sed -n "1p;3p;4p" zcl.txt
101,Fuck,aa
103,eric,cc
104,laonanhai,dd
[[email protected] zcl]# 

特殊符号{}的选择

[[email protected] zcl]# sed -n '2,3p;=' zcl.txt 
1
102,alex,bb
2
103,eric,cc
3
4
[[email protected] zcl]# sed -n '2,3{p;=}' zcl.txt
102,alex,bb
2
103,eric,cc
3
[[email protected] zcl]# 
  • 指令表达:-n去掉默许输出,2,4p,输出2到4行内容,=输出全体的行的行号

  • 一声令下表明: ‘2,4{p;=}’代表联合输出2,4行的行号和剧情

 

参报考博士大学生客:

 

壹 、前言
大家都知情,在Linux中全体皆文件,比如配置文件,日志文件,运营文件等等。假设我们相对…

特殊符号=获取行号

[root@chengliang zcl]# sed '=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
4
104,laonanhai,dd
命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。

[root@chengliang zcl]# sed '1,3=' zcl.txt
1
101,Fuck,aa
2
102,alex,bb
3
103,eric,cc
104,laonanhai,dd
命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容

[root@chengliang zcl]#
[root@chengliang zcl]# sed '/alex/=' zcl.txt
101,Fuck,aa
2
102,alex,bb
103,eric,cc
104,laonanhai,dd
命令说明:只打印正则匹配行的行号,同时输出文件中的内容

[root@chengliang zcl]# sed -n '/alex/=' zcl.txt
2
命令说明:只显示行号但不显示行的内容即取消默认输出

[root@chengliang zcl]# sed -n '$=' zcl.txt
4
[root@chengliang zcl]# 
命令说明:“$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

办法立异:

[root@chengliang zcl]# sed '=' zcl.txt | sed 'N;s#\n# #'      
1 101,Fuck,aa
2 102,alex,bb
3 103,eric,cc
4 104,laonanhai,dd
[root@chengliang zcl]# 

  

sed怎么着取不总是的行

[root@chengliang zcl]# sed -n "1p;3p;4p" zcl.txt
101,Fuck,aa
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

特殊符号{}的采取

[root@chengliang zcl]# sed -n '2,3p;=' zcl.txt 
1
102,alex,bb
2
103,eric,cc
3
4
[root@chengliang zcl]# sed -n '2,3{p;=}' zcl.txt
102,alex,bb
2
103,eric,cc
3
[root@chengliang zcl]# 
  • 一声令下表明:-n去掉私下认可输出,2,4p,输出2到4行内容,=输出全体的行的行号

  • 指令表明: ‘2,4{p;=}’代表统一输出2,4行的行号和内容

 

参考博客:

 

6.2.3.3 变量替换

变量替换其实和后边的文本替换是平等的,就是具体的公文变成了变量,同时要求大家对引号的用法要有明晰的敞亮,由此对双引号和单引号的分别不太了然的校友,请以往面翻页到【引号的界别总计】再度复习一下。

[root@chensiqi1 ~]# cat >test.txt<<KOF #再新建一个简单的测试文本
> a
> b
> a
> KOF
[root@chensiqi1 ~]# cat test.txt 
a
b
a
[root@chensiqi1 ~]# x=a #->设置变量x并 赋值a
[root@chensiqi1 ~]# y=b #-> 设置变量y并赋值b
[root@chensiqi1 ~]# echo $x
a
[root@chensiqi1 ~]# echo $x $y
a b

命令说明:打印变量x,y验证一下,需要使用$符号引用变量

不行使引号:

[root@chensiqi1 ~]# sed s#$x#$y#g test.txt 
b
b
b

命令说明:使用变量进行替换,从执行结果中我们可以发现替换成功了,test.txt文件中所有的a都替换成了b。同时我们可以发现s#$x#$y#g没有使用引号,当然这种写法并不是特别标准。

[root@chensiqi1 ~]# sed 's#'$x'#'$y'#g' test.txt 
b
b
b

命令说明:表面看起来单引号是可以用的,但其实这里用了障眼法,在你们眼中分段‘$x’和'$y',但其实分段是‘s#’和‘#’和‘#g’,所以$x和$y并没有被引号扩起来,和上面的例子就一样了。

使用eval命令:

[root@chensiqi1 ~]# eval sed 's#$x#$y#g' test.txt 
b
b
b

命令说明:这里给大家扩展一个Linux内置命令eval,这个命令能读入变量,并将他们组合成一个新的命令,然后执行。首先eval会解析变量$x和变量$y,最后达到的效果和双引号是一样的。

恢宏:最便捷的得到IP地址的章程

[root@chensiqi1 ~]# hostname -I
192.168.197.133 
6.2.3.4 分组替换()和\1的使用表明

sed软件的()的职能能够记住正则表明式的一某个,在这之中,\1为率先个牢记的格局即首先个小括号中的匹配内容,\二遍之个难忘的形式,即第③个小括号中的匹配内容,sed最多能够记住7个。

例:echo “I am chensiqi
teacher.”假若想保留这一行的单词chensiqi,删除剩下部分,使用圆括号标记想保留的部分。

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed 's#^.*am \([a-z]\+\) tea.*$#\1#g'
chensiqi

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#^.*am ([a-z]+) tea.*$#\1#g'
chensiqi

[root@chensiqi1 ~]# echo "I am chensiqi teacher." | sed -r 's#I (.*) (.*) teacher.#\1\2#g'
amchensiqi

命令说明:
sed如果不加-r后缀,那么默认不支持扩展正则表达式,需要\符号进行转义。小括号的作用是将括号里的匹配内容进行分组以便在第2和第3个#号之间进行sed的反向引用,\1代表引用第一组,\2代表引用第二组

再来看个难点:请执行命令取出linux中的eth0的IP地址?

[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p'
          inet addr:192.168.197.133  Bcast:192.168.197.255  Mask:255.255.255.0
[root@chensiqi1 ~]# ifconfig eth0 | sed -n '2p' | sed -r 's#^.*addr:(.*) Bcast:.*$#\1#g'
192.168.197.133 

也可以进行组合

[root@chensiqi1 ~]# ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'
192.168.197.133 

命令说明:
这道题是需要把ifconfig eth0执行结果的第2行的IP地址取出来,上面答案的思路是用IP地址来替换第2行的内容。

商厦案例4:系统开机运行项优化(利用sed)

[root@chensiqi1 ~]# chkconfig --list | egrep -v  "sshd|crond|rsyslog|sysstat|network" | awk '{print $1}' |sed -r 's#^(.*)#chkconfig \1 off#g' |bash

这题也可以应用awk直接一步到位
[root@chensiqi1 ~]# chkconfig --list | egrep -v "sshd|crond|network|rsyslog|sysstat" | awk '{print "chkconfig",$1,"off"}' | bash
6.2.3.5 特殊符号&代表被轮换的内容

那是1个特技,在符合的现象使用专门有利。上边用特殊符号“&”与分组替换一起使用,举行对照。

[root@chensiqi1 ~]# sed -r 's#(.*),(.*),(.*)#& ----- \1 \2 \3#' person.txt 
101,chensiqi,CEO ----- 101 chensiqi CEO
102,zhangyang,CTO ----- 102 zhangyang CTO
103,Alex,COO ----- 103 Alex COO
104,yy,CFO ----- 104 yy CFO
105,feixue,CIO ----- 105 feixue CIO

命令说明:
    1,这里将分组替换和&符号放在一起对比
    2,命令中的分组替换使用了3个小括号,每个小括号分别代表每一行以逗号作为分隔符的每一列。
    3,上面命令的&符号代表每一行,即模型中‘s#目标内容#替换内容#g’的目标内容。

商厦案例5:批量重命名文件
当前目录下有文件如下所示:

[root@chensiqi1 chen]# find ./ -name "*_finished.jpg"
./stu_102999_1_finished.jpg
./stu_102999_5_finished.jpg
./stu_102999_3_finished.jpg
./stu_102999_2_finished.jpg
./stu_102999_4_finished.jpg

渴求用sed命令重命名,效果为
stu_102999_1_finished.jpg==>stu_102999_1.jpg,即除去文件名的_finished

解题思路:因为这是文本名,无法直接yongsed命令替换,由此还亟需借助mv命令重命名,格式为:mv
stu_102999_1_finished.jpg
stu_102999_1.jpg.大家须要拼凑这样的格式,然后使用bash命令执行即可。

[root@chensiqi1 chen]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#\1\2#g'
./stu_102999_1.jpg
./stu_102999_5.jpg
./stu_102999_3.jpg
./stu_102999_2.jpg
[root@chensiqi1 chen]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#& \1\2#g' 
./stu_102999_1_finished.jpg ./stu_102999_1.jpg
./stu_102999_5_finished.jpg ./stu_102999_5.jpg
./stu_102999_3_finished.jpg ./stu_102999_3.jpg
./stu_102999_2_finished.jpg ./stu_102999_2.jpg
./stu_102999_4_finished.jpg ./stu_102999_4.jpg
[root@chensiqi1 chen]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' 
mv ./stu_102999_1_finished.jpg ./stu_102999_1.jpg
mv ./stu_102999_5_finished.jpg ./stu_102999_5.jpg
mv ./stu_102999_3_finished.jpg ./stu_102999_3.jpg
mv ./stu_102999_2_finished.jpg ./stu_102999_2.jpg
mv ./stu_102999_4_finished.jpg ./stu_102999_4.jpg
[root@chensiqi1 chen]# find ./ -name "*_finished.jpg" | sed -r 's#^(.*)_finished(.*)#mv & \1\2#g' |bash
[root@chensiqi1 chen]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

命令说明:
1.“\1”代表前面“(^.*)”匹配内容,“&”代表“s# #”里被替换的内容,这里匹配到的是完整的文件名。
2.使用bash命令执行,bash命令执行标准输入的语句,如同我们在命令行输入语句后敲回车。

6.2.4 查

  • 学到这里,我们可以稍微喘口气了,因为sed里最常用最珍视的大家早就学完了,接下去大家轻松的学完最后一招–>查看文本
  • 本条效果也是老大得有用,比如大家想查看文件中的有个别行,从前最常用的是cat或more或less命令等,但那些命令有个别欠缺,正是不可能查看钦定的行。而大家用了很久的sed命令就有了那一个意义了。而且大家眼下也说过使用sed比别的命令vim等读取速度更快!
  • 那边大家须求用到二个sed命令
  • “p”:输出钦赐内容,但暗中认可会输出三次金童玉女的结果,因而使用-n选项撤销暗中同意输出,记念方法:p的全拼是print,意思是打字与印刷。
6.2.4.1 按行查询
[root@chensiqi1 ~]# sed '2p' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed -n '2p' person.txt 
102,zhangyang,CTO

命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chensiqi1 ~]# sed -n '2,3p' person.txt 
102,zhangyang,CTO
103,Alex,COO

命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[root@chensiqi1 ~]# sed -n '1~2p' person.txt 
101,chensiqi,CEO
103,Alex,COO
105,feixue,CIO

命令说明:打印文件的1,3,5行。~代表步长

[root@chensiqi1 ~]# sed -n 'p' person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:不指定地址范围,默认打印全部内容。
6.2.4.2 按字符串查询
[root@chensiqi1 ~]# sed -n '/CTO/p' person.txt 
102,zhangyang,CTO

命令说明:打印含CTO的行

[root@chensiqi1 ~]# sed -n '/CTO/,/CFO/p' person.txt 
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO

命令说明:打印含CTO的行到含CFO的行。
6.2.4.3 混合查询
[root@chensiqi1 ~]# sed -n '2,/CFO/p' person.txt 
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO

命令说明:打印第2行到含CFO的行。

[root@chensiqi1 ~]# sed -n '/feixue/,2p' person.txt 
105,feixue,CIO

命令说明:特殊情况,前两行没有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行。所以这种混合地址不推荐使用。
6.2.4.4 过滤四个字符
[root@chensiqi1 ~]# sed -rn '/chensiqi|yy/p' person.txt 
101,chensiqi,CEO
104,yy,CFO

命令说明:
    使用扩展正则“|”,为了不使用转义符号“\”,因此使用-r选项开启扩展正则表达式模式

7,sed命令应用知识扩张

7.1 sed修改文件的还要拓展备份

[root@chensiqi1 ~]# cat person.txt 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# sed -i.bak 's#zhangyang#NB#g' person.txt 
[root@chensiqi1 ~]# cat person.txt
101,chensiqi,CEO
102,NB,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@chensiqi1 ~]# cat person.txt.bak 
101,chensiqi,CEO
102,zhangyang,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令行说明:
    在-i参数的后边加上.bak(.任意字符),sed会对文件进行先备份后修改

7.2 特殊符号=获取行号

[root@chensiqi1 ~]# sed '=' person.txt
1
101,chensiqi,CEO
2
102,NB,CTO
3
103,Alex,COO
4
104,yy,CFO
5
105,feixue,CIO

命令说明:使用特殊符号“=”就可以获取文件的行号,这是特殊用法,记住即可。从上面的命令结果我们也发现了一个不好的地方:行号和行不在一行。

[root@chensiqi1 ~]# sed '1,3=' person.txt
1
101,chensiqi,CEO
2
102,NB,CTO
3
103,Alex,COO
104,yy,CFO
105,feixue,CIO

命令说明:只打印1,2,3行的行号,同时打印输出文件中的内容

[root@chensiqi1 ~]# sed '/yy/=' person.txt
101,chensiqi,CEO
102,NB,CTO
103,Alex,COO
4
104,yy,CFO
105,feixue,CIO

命令说明:
    只打印正则匹配行的行号,同时输出文件中的内容

[root@chensiqi1 ~]# sed -n '/yy/=' person.txt
4

命令说明:只显示行号但不显示行的内容即取消默认输出。

[root@chensiqi1 ~]# sed -n '$=' person.txt
5

命令说明:
    “$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。

艺术革新:

[root@chensiqi1 ~]# sed '=' person.txt | sed 'N;s#\n# #'
1 101,chensiqi,CEO
2 102,NB,CTO
3 103,Alex,COO
4 104,yy,CFO
5 105,feixue,CIO

命令说明:前面sed获取文件的行号有一个缺点,我们这里使用Sed命令N来补偿这个缺点。Sed命令N读取下一行数据并附加到模式空间。

7.3 sed怎么样取不接二连三的行

[root@chensiqi1 ~]# sed -n '1p;3p;5p' person.txt
101,chensiqi,CEO
103,Alex,COO
105,feixue,CIO

7.4 特殊符号{}的使用

[root@chensiqi1 ~]# sed -n '2,4p;=' person.txt
1
102,NB,CTO
2
103,Alex,COO
3
104,yy,CFO
4
5

命令说明:-n去掉默认输出,2,4p,输出2到4行内容,=输出全部的行的行号

[root@chensiqi1 ~]# sed -n '2,4{p;=}' person.txt
102,NB,CTO
2
103,Alex,COO
3
104,yy,CFO
4

命令说明:
    ‘2,4{p;=}’代表统一输出2,4行的行号和内容

相关文章