1.1 功能与版本

sed命令时操作,过滤和转换文本内容的强大工具。常用功能有增删改查。期中查询的功能中最常用的2大功能时过滤,取行

[root@AIGE cron]# sed --version

GNU sed version 4.2.1

[root@AIGE cron]# uname -r

2.6.32-642.el6.x86_64

[root@AIGE cron]# cat /etc/redhat-release

CentOS release 6.8 (Final)

1.1.1 语法格式

sed [options] [sed-commands] [input-file]

说明:

1. 注意sed软件及后面选项,sed命令和输入文件,每隔元素之间都至少有一个空格。

2. sed-commands既可以是单个sed命令,也可以是多个sed命令组合

3. input-file(输入文件)是可选项,sed还能够从标准的输入如管道获取输入

1.1.2 命令执行流程

概括:sed软件从文件或管道中读取一行,处理一行,输出一行,然后继续第二行,循环至文件结束。

流程图:

sed软件有两个内置的存储空间:

模式空间(pattern space):是sed软件从文件读取一行文本然后存入的缓冲区(这个缓冲区是在内存中的),然后使用sed命令操作模式空间的内容。

保持空间(hold space):是sed软件另一个缓冲区,用来存放临时数据,也是在内存中的,但是模式空间和保持空间的用途是不一样的。sed可以交换保持空间和模式空间的数据,但是不能在保持空间上执行普通的sed命令,也就是说我们可以在保持空间存储数据。

初始情况,模式空间和保持空间都是没有内容的。每次循环读取数据的过程中,模式空间的原内容都会被清空写入新的内容。但保持空间的内容保持不变,不会在循环中被删除,除非使用sed命令操作保持空间。

1.1.3 参数说明:

[options][选项]

解释说明

-n

取消默认的sed软件的输出,常与sed命令的P连用

-e

一行命令语句可以执行多条sed命令

-f

选项后面可以接sed脚本的文件名

-r

使用扩展正则表达式,默认情况sed只识别基本正则表达式

-i

直接修改文件内容,而不是输出到终端,如果不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件

sed-commands

[sed命令]

解释说明

a

追加,在指定行后面添加一行或多行文本

c

取代指定的行

d

删除指定的行

D

删除模式空间的部分内容,知道遇到换行符、n结束操作,与多行模式相关

i

插入,在指定行前添加一行或多行文本

h

把模式空间的内容追加到保持空间

g

把保持空间的内容复制到模式空间

G

把保持空间的内容追加到模式空间

x

交换模式空间和保持空间的内容

l

打印不可见的字符

n

清空模式空间的内容并读入下一行

N

不清空模式空间,并读取下一行数据并追加到模式空间

p

打印模式空间的内容,通常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命令

{}

对单个地址或地址范围执行批量操作

+

地址范围中用到的符号,做加法运算

1.2 增删改查

实验文本:

  1 [root@AIGE aige]# cat lirc.txt
  2
  3 I look in your eyes
  4
  5 just don't know what to say
  6
  7 It feels like I'm drowning in salty water
  8
  9 A few hours left 'til the sun's gonna rise
 10
 11 tomorrow will come an it's time to realize
 12
 13 our love has finished forever
 14
 15 how I wish to come with you
 16 

view code

1.2.1 增

单行增加

行后,append

  1 [root@AIGE aige]# sed '2a This is my input' lirc.txt |cat -n
  2
  3 1 I look in your eyes
  4
  5 2 just don't know what to say
  6
  7 3 This is my input
  8
  9 4 It feels like I'm drowning in salty water
 10
 11 5 A few hours left 'til the sun's gonna rise
 12
 13 6 tomorrow will come an it's time to realize
 14
 15 7 our love has finished forever
 16
 17 8 how I wish to come with you
 18 

view code

$表示最后一行, $a

行前,insert

  1 [root@AIGE aige]# sed '2i This is my input' lirc.txt |cat -n
  2
  3 1 I look in your eyes
  4
  5 2 This is my input
  6
  7 3 just don't know what to say
  8
  9 4 It feels like I'm drowning in salty water
 10
 11 5 A few hours left 'til the sun's gonna rise
 12
 13 6 tomorrow will come an it's time to realize
 14
 15 7 our love has finished forever
 16
 17 8 how I wish to come with you
 18 

view code

多行增加

  1 [root@AIGE aige]# sed '2a This is my input\n This is two!!!!!!!!!!!!!' lirc.txt |cat -n
  2
  3 1 I look in your eyes
  4
  5 2 just don't know what to say
  6
  7 3 This is my input
  8
  9 4 This is two!!!!!!!!!!!!!
 10
 11 5 It feels like I'm drowning in salty water
 12
 13 6 A few hours left 'til the sun's gonna rise
 14
 15 7 tomorrow will come an it's time to realize
 16
 17 8 our love has finished forever
 18
 19 9 how I wish to come with you
 20 

view code

  1 [root@AIGE aige]# sed '2i This is my input\n This is two!!!!!!!!!!!!!' lirc.txt |cat -n
  2
  3 1 I look in your eyes
  4
  5 2 This is my input
  6
  7 3 This is two!!!!!!!!!!!!!
  8
  9 4 just don't know what to say
 10
 11 5 It feels like I'm drowning in salty water
 12
 13 6 A few hours left 'til the sun's gonna rise
 14
 15 7 tomorrow will come an it's time to realize
 16
 17 8 our love has finished forever
 18
 19 9 how I wish to come with you
 20 

view code

1.2.2 删

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和20行

1~2{sed-commands}

对1,3,5基数行操作

10.$ {sed-commands}

对10到最后一行操作

/aige/{sed-commands}

对匹配aige的行操作

/aige/,/can/{sed-commands}

对匹配aige和can的行进行操作

/aige/,${sed-commands}

对匹配aige到最后一行

/aige/,10{sed-commands}

对匹配aige到往后加10行操作

1,/can/{sed-commands}

第一行到配合can的行

/aige/,+2{sed-commands}

对匹配aige的行其后的2行操作

对~的解释。

格式:“first~step”表示从first行开始,以步长step递增,等差。

  1 [root@AIGE aige]# seq 10 |sed -n '1~2p'
  2
  3 1
  4
  5 3
  6
  7 5
  8
  9 7
 10
 11 9
 12 

view code

  1 [root@AIGE aige]# sed '3,$d' lirc.txt
  2
  3 I look in your eyes
  4
  5 just don't know what to say
  6 

view code

取反

  1 [root@AIGE aige]# sed '2!d' person.txt
  2
  3 102,zhangyao,CTO
  4
  5 [root@AIGE aige]#
  6 

view code

1.2.3 改

参数c:

  1 [root@AIGE aige]# sed '2c This is my input' lirc.txt |cat -n
  2
  3 1 I look in your eyes
  4
  5 2 This is my input
  6
  7 3 It feels like I'm drowning in salty water
  8
  9 4 A few hours left 'til the sun's gonna rise
 10
 11 5 tomorrow will come an it's time to realize
 12
 13 6 our love has finished forever
 14
 15 7 how I wish to come with you
 16 

view code

1.2.4 文本替换

选项:

“s”:单独使用->将每一行中第一处匹配的字符串进行替换。

“g”:每一行进行全部替换->sed命令s的替换标志之一(全局替换),非sed命令

“-i”:修改文件内容->sed软件的选项,注意和sed命令i区分

  1 sed -i 's/old/new/g' person.txt
  2
  3 sed -i 's#old#new#g' person.txt
  4 

特点:

1. 两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。字符#能在替换内容包含字符/有助于区别。定界符可以是任意字符如:或|等,但当替换内容包含定界符时,需要转义既“\”。建议使用#

2. 定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。

3. s#old#new#g,old:能用正则表达式,但new不能用,必须具体。new,用正则- -你想换什么?

4. 默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

参数sg

  1 [root@AIGE aige]# sed 's#l#TEST#' lirc.txt
  2
  3 I TESTook in your eyes
  4
  5 just don't know what to say
  6
  7 It feeTESTs like I'm drowning in salty water
  8
  9 [root@AIGE aige]# sed 's#l#TEST#g' lirc.txt
 10
 11 I TESTook in your eyes
 12
 13 just don't know what to say
 14
 15 It feeTESTs TESTike I'm drowning in saTESTty water
 16
 17  cat >test.txt<<EOF
 18 a
 19 b
 20 a
 21 EOF
 22
 23 eval sed 's#$x#$y#g' test.txt
 24
 25 b
 26
 27 b
 28
 29 b
 30
 31 [root@AIGE aige]# echo '`hostname -I`'
 32
 33 `hostname -I`
 34
 35 [root@AIGE aige]# eval echo '`hostname -I`'
 36
 37 10.0.0.100 172.168.1.100
 38
 39 [root@AIGE aige]#
 40 

view code

开机自启动优化:

  1 chkconfig --list|grep 3:on|egrep -v "crond|sshd|network|rsyslog|sysstat"|awk '{print "chkconfig",$1,"off"}'|bash

view code

扩展正则

  1 [root@AIGE aige]# sed -n 's#\(look\)#\1#gp' lirc.txt
  2
  3 I look in your eyes
  4
  5 [root@AIGE aige]# sed -rn 's#(look)#\1#gp' lirc.txt
  6
  7 I look in your eyes
  8 

view code

&代表被替换的内容

  1 [root@AIGE aige]# sed -rn 's#I (.*) in#\1-------&#gp' lirc.txt
  2
  3 look-------I look in your eyes
  4
  5 [root@AIGE aige]#
  6 

view code

批量改名:

  1 [root@AIGE test]# ls | sed -r 's#(.*)(_finished)(.*)#mv & \1\3#g'
  2
  3 mv stu_102999_1_finished.jpg stu_102999_1.jpg
  4
  5 mv stu_102999_2_finished.jpg stu_102999_2.jpg
  6
  7 mv stu_102999_3_finished.jpg stu_102999_3.jpg
  8
  9 mv stu_102999_4_finished.jpg stu_102999_4.jpg
 10
 11 mv stu_102999_5_finished.jpg stu_102999_5.jpg
 12
 13 rename "_finished" "" *.jpg
 14 

view code

1.2.5 查

“p”:输出指定内容,但默认会输出2次匹配的结果,因此使用-n选项取消默认输出

p:print

  1 [root@AIGE aige]# sed -n '2p' lirc.txt
  2
  3 just don't know what to say
  4 

view code

1.2.6 扩展正则
  1 sed -rn '/aige|jack/' person.txt

正则需要//,必须用

awk的正则也一样

1.2.7 修改文件

备份文件

sed -i.ori 's#zhangyao#NB#' person.txt

sed '[地址范围|模式范围] s#[被替换的字符串]#[替换后的字符串]#[替换标志]' [输入文件]

命令说明:

1.[地址范围|模式范围]:可选项,如果没有指定,sed软件将在所有行上进行替换。

2.“s”既执行替换命令substitute

3.被替换的字符串。可以是一个正则表达式

4.替换后的字符串,只能是一个具体的内容

5.替换标志:可选项,包括前面详述的全局标志。g(global),还有数字标志。打印标志p(print),写标志w(write),忽略大小写i(ignore),执行命令标志e(excute),根据需要可以把一个或多个代替标志组合起来使用

1.2.8 另存为文件

sed 'w newfile.txt' oldfile.txt

1.3 扩展

1.3.1 Ms# # #Ng:

语法说明:M N也就是坐标

Ms----对第M行处理,无G替换标志,只处理第一处,有g替换标志则对第M行全部替换

Ng---对每一行,从第N处开始替换 N范围1-512

Ms、Ng何用表示只对第M行从第N处匹配开始替换

  1 [root@AIGE aige]# cat test
  2 1 1 1 1 1 1 1 1
  3 1 1 1 1 1 1 1 1
  4 1 1 1 1 1 1 1 1
  5 1 1 1 1 1 1 1 1
  6 1 1 1 1 1 1 1 1
  7 1 1 1 1 1 1 1 1
  8 1 1 1 1 1 1 1 1
  9 1 1 1 1 1 1 1 1
 10 

view code

  1 [root@AIGE aige]# sed 's#1#0#2g' test
  2 1 0 0 0 0 0 0 0
  3 1 0 0 0 0 0 0 0
  4 1 0 0 0 0 0 0 0
  5 1 0 0 0 0 0 0 0
  6 1 0 0 0 0 0 0 0
  7 1 0 0 0 0 0 0 0
  8 1 0 0 0 0 0 0 0
  9 1 0 0 0 0 0 0 0
 10 

view code

  1 [root@AIGE aige]# sed '5s#1#0#g' test
  2 1 1 1 1 1 1 1 1
  3 1 1 1 1 1 1 1 1
  4 1 1 1 1 1 1 1 1
  5 1 1 1 1 1 1 1 1
  6 0 0 0 0 0 0 0 0
  7 1 1 1 1 1 1 1 1
  8 1 1 1 1 1 1 1 1
  9 1 1 1 1 1 1 1 1
 10 

view code

  1 [root@AIGE aige]# sed '5s#1#0#5g' test
  2 1 1 1 1 1 1 1 1
  3 1 1 1 1 1 1 1 1
  4 1 1 1 1 1 1 1 1
  5 1 1 1 1 1 1 1 1
 6 1 1 1 1 0 0 0 0
 7 1 1 1 1 1 1 1 1
 8 1 1 1 1 1 1 1 1
 9 1 1 1 1 1 1 1 1

view code

忽略大小写

sed 's#old#new#gi' test.txt

获取行号

  1 [root@AIGE aige]# sed "=" lirc.txt |sed 'N;s#\n# #'
  2 1 I look in your eyes
  3 2 just don't know what to say
  4 3 It feels like I'm drowning in salty water
  5 4 A few hours left 'til the sun's gonna rise
  6 5 tomorrow will come an it's time to realize
  7 6 our love has finished forever
  8 7 how I wish to come with you
  9 

view code

1.3.2 一条sed语句执行多条命令

-e:

sed -e '3,$d' -e 's#10#01#' person.txt

分号;

sed '3,$d;s#10#01#' person.txt

-f:指定一个文件person.sed里的内容来做sed命令

[root@AIGE aige]# cat person.sed

3,$d

s#10#01#g

[root@AIGE aige]# sed -f person.sed person.txt

011,oldboy,CEO

012,zhangyao,CTO

1.3.3 一些联系和{}用法

  1 [root@AIGE aige]# wc -l lirc.txt
  2 7 lirc.txt
  3 [root@AIGE aige]# sed -n "$=" lirc.txt
  4 7
  5 [root@AIGE aige]#
  6 [root@AIGE sed-4.2.1]# sed -n '5p;50p;60p' /etc/services
  7 # IANA services version: last updated 2009-11-10
  8 # 24 - private mail system
  9 nameserver 42/udp name # IEN 116
 10 

view code

{}可以把多个命令括起来,用来处理单个地址或者地址范围

  1 [root@AIGE aige]# sed -n '2,3{p;=}' person.txt
  2 102,zhangyao,CTO
  3 2
  4 103,Alex,COO
  5 3
  6 

view code

1.4 保持空间两个命令

1.4.1 命令n

命令n的作用:清空当前模式空间的内容,然后从输入文件中读取下一行。如果在命令行执行过程中遇到n,那么它会改变正常的执行流程。(读取数据,执行命令,打印输出,重复循环)

[root@AIGE aige]# sed -n 'n;p' person.txt

102,zhangyao,CTO

104,yy,CFO

1.4.2 命令N

命令N的作用:不会清空模式空间的内容,并且从输入文件中读取下一行的数据,追加到模式空间中,两行数据换行符\n连接。

反转:

  1 [root@AIGE aige]# rev person.txt
  2 OEC,yobdlo,101
  3 OTC,oaygnahz,201
  4 OOC,xelA,301
  5 OFC,yy,401
  6 OIC,euxief,501
  7 [root@AIGE aige]# tac person.txt
  8 105,feixue,CIO
  9 104,yy,CFO
 10 103,Alex,COO
 11 102,zhangyao,CTO
 12 101,oldboy,CEO
 13 [root@AIGE aige]# sed -n '1!G;h;$p' person.txt
 14 105,feixue,CIO
 15 104,yy,CFO
 16 103,Alex,COO
 17 102,zhangyao,CTO
 18 101,oldboy,CEO

view code

1.5 sedsed调试工具

软件官网: http://aurelio.net/projects/sedsed/。

wget  http://sedsed.sourceforge.net/sedsed-1.0 -O /bin/sedsed

chmod +x /bin/sedsed

[root@AIGE aige]# sedsed -d --hide=hold -n '2,3p;=' person.txt

选项

解释说明

-d

开启调试模式

--hide

隐藏一些调试信息,选项有:PATT,HOLD,COMM

PATT是pattern模式的缩写,既模式空间

HOLD是保持空间

COMM是command的缩写,既sed命令

-n

取消默认输出

$

这个符号正则表示文件的结尾。如果文件的开头是$,则表示空行

转载于:https://www.cnblogs.com/can-H/articles/6430371.html

12-sed命令详解相关推荐

  1. cut\grep\awk\sed命令详解

    cut\grep\awk\sed命令详解 1.cut命令详解及实例 (1)作用:提取文件中指定的列 语法格式:cut  选项  文件名   (2)选项作用:      -d 分隔符     按照指定的 ...

  2. Linux的sed命令详解大全

    Linux的sed命令详解大全 一.sed命令介绍 二.sed 的运行模式 三.sed的相关选项 四.sed基本用法 1.sed语法 2.sed的查看功能 ①查看passwd文件的第5到第8行内容 ② ...

  3. linux sed p变量,Linux sed 命令详解系列教程之各种问题解决

    本文目录: 1 sed中使用变量和变量替换的问题 2 反向引用失效问题 3 "-i"选项的文件保存问题 4 贪婪匹配问题 5 sed命令"a"和"N& ...

  4. 【转】【Linux】sed命令详解

    sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space ...

  5. LInux sed命令详解

    文章转自:http://qifuguang.me/2015/09/21/sed%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3/#comments sed命令详解 sed是st ...

  6. linux 之sed命令详解

    sed命令详解 sed是什么 sed是linux文本处理三剑客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大. sed的工作过程 sed处理文本时每次从文件复制出来一行,放在工 ...

  7. ubuntu下sed命令详解 - Dicky - 开源中国社区

    ubuntu下sed命令详解 - Dicky - 开源中国社区 ubuntu下sed命令详解 - Dicky - 开源中国社区 ubuntu下sed命令详解     7人收藏此文章, 我要收藏 发表于 ...

  8. linux sed.写文件,Linux文件处理sed命令-linux sed命令详解-linux sed写入文件-嗨客网

    Linux文件处理sed命令详解教程 Linux sed命令使用 Linux sed 命令处理时,把当前处理的行存储在临时缓冲区中,称为 "模式空间"( oattern space ...

  9. 【Linux篇】sed命令详解

    文章目录 sed命令详解 一.基本语法 二.实操案例 内部命令选项说明 命令选项说明 标志 三.sed小技巧 sed命令详解 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时 ...

  10. linux sed 命令,Linux sed 命令详解

    Linux sed 命令详解 Linux sed 命令是利用脚本处理文本文件. sed 可按照脚本的指令来处理.编辑文本文件. sed 主要用于自动编辑一个或多个文件.简化对文件的反复操作.编写转换程 ...

最新文章

  1. iOS直播(三)GPUImage音视频采集并写入文件
  2. 三层交换机----VRRP协议学习
  3. MATLAB随机信号统计特征
  4. 【今日头条】热文周榜、热搜榜
  5. LOL手游最能混分的英雄,前期刷野靠队友,迪丽阿巴亲自教学
  6. solr源码导入eclipse
  7. 新书推荐 |《5G安全技术与标准》
  8. 从Postman到ApiPost——码农闰土
  9. Activity工作流工作笔记001---快速上手_认识工作流
  10. 移动应用测试基于JAVA_Appium用于测试Android混合移动应用程序
  11. 区块链的可视化:hash,block,blockchain,distributed,tokens,coinbase
  12. 从OpenJDK官网下载JDK源码
  13. 无人机基础知识:多旋翼无人机各模式控制框图
  14. 制程与良率,谁才是芯片厂商的竞赛底牌?
  15. MFC 登陆界面 创建地方
  16. AdGuard更多规则推荐
  17. 中年刘强东背后,是已婚男性的集体挣扎
  18. C语言简单编程案例——(五)
  19. 3GPP TS 23501-g51 中英文对照 | 4.1 General concepts
  20. Spring Integration

热门文章

  1. Linux | Ubuntu:十年,十个关键时刻
  2. Hi,我们是-MobileNet-家族
  3. OpenCV | 图片与视频的相互转换(C++Python)
  4. android冒烟测试自动化,安卓自动化测试总结(五)——测试结果发送及内容展示...
  5. android倒计时动画特效,Android仿活动时分秒倒计时效果
  6. python计算最大回撤_最大回撤线性算法实现
  7. mscoco数据集_caffe详解之数据层
  8. java多客户端请求响应_Java实现服务器端对多个客户端请求响应
  9. anaconda3 2.3.9 下载_多体系如何融合?先做好体系意识的培训!(附4合1体系培训下载)...
  10. 软考高级论文如何“吹”