sed命令的使用

Posted 杨灏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed命令的使用相关的知识,希望对你有一定的参考价值。

介绍

sed是stream Editor(字符流编辑器)的缩写,简称流编辑器。sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

软件功能与版本

sed命令是操作、过滤和转换文本内容的强大工具,常用功能有增删改查,其中查询的功能中最常用的2大功能是过滤(过滤指字符串),取行(取出指定行)

查看一下sed版本

[[email protected] ~]# cat /etc/redhat-release

CentOS release 6.8 (Final)

[[email protected] ~]# sed --version

GNU sed version 4.2.1

语法格式

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

sed [选项]  [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==>这里gs命令的替换标志,注意和g命令区分

w

另存,把模式空间内容保存到文件中

y

根据对应位置转换字符

label

定义一个标签

b label

执行该标签后面的命令

t

如果前面的命令执行成功,那么就跳转到t指定的标签处,继续往下执行后续命令。否则,仍然继续正常的执行流程。

 

特殊符号

解释说明

对指定行以外的所有行应用命令

=

打印当前行行号

~

“First~Step”表示出First行开始,以步长Step递增

&

代表被替换的内容

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

{}

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

+

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

使用范例

统一实验文本

cat >person.txt<<EOF

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

EOF

[[email protected] tmp]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

常用功能--增删改查

单行增加

a追加

[[email protected] tmp]# sed ‘2a aaaaaaaaaaaa‘ /tmp/person.txt

101,oldboy,CEO

102,zhangyao,CTO

aaaaaaaaaaaa

103,Alex,COO

104,yy,CFO

105,feixue,CIO

i插入

[[email protected] tmp]# sed ‘2i aaaaaaaaaaaa‘ /tmp/person.txt

101,oldboy,CEO

aaaaaaaaaaaa

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

多行增加

首先我们需要一个特殊符号“\n”,这个符号叫做换行符

[[email protected] ~]# echo "oldboy";echo "oldboy"

oldboy

oldboy

[[email protected] ~]# echo -e "oldboy \noldboy"

oldboy

oldboy



[[email protected] ~]# sed ‘2a 106,yanghao \n107,lidao‘ /tmp/person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,yanghao

107,lidao

103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

[[email protected] tmp]# sed ‘2i 106,dandan,CSO\n107,bingbing,CCO\n108\n109‘ person.txt

101,oldboy,CEO

106,dandan,CSO

107,bingbing,CCO

108

109

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

指定执行的地址范围

地址范围

含义

10{sed-commands}

对第10行操作

10,20{sed-commands}

1020行操作,包括第1020

10,+20{sed-commands}

103010+20)行操作,包括第1030

1~2{sed-commands}

1357.......行操作

10,${sed-commands}

10到最后一行($代表最后一行)操作,包括第10

/oldboy/{sed-commands}

对匹配oldboy的行操作

/oldboy/,/Alex/{sed-commands}

对匹配oldboy的行到最后匹配Alex的行操作

/oldboy/,10{sed-commands}

对匹配oldboy的行到第10行操作

1,/Alex/{sed-commands}

对第1行到匹配Alex的行操作

/oldboy/,+2{sed-commands}

对匹配oldboy的行到其后的2行操作

/oldboy/,${sed-commands}

对匹配oldboy的行到最后一行操作

单行进操作

[[email protected] tmp]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘2d‘ person.txt

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

多行进行操作

[[email protected] tmp]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘2,5d‘ person.txt

101,oldboy,CEO

[[email protected] tmp]#

删除不连续的行

[[email protected] tmp]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘2d;5d‘ person.txt

101,oldboy,CEO

103,Alex,COO

104,yy,CFO

使用正则的方法

[[email protected] tmp]# sed ‘/oldboy/d‘ person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘/101/,/104/d‘ person.txt

105,feixue,CIO

整行替换c

[[email protected] tmp]# cat person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘2c 106,yanghao,CSO‘ person.txt

101,oldboy,CEO

106,yanghao,CSO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

文本替换

sed命令,选项;

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

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

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

g 表示行内全面替换。

p 表示打印行。

w 表示把行写入一个文件。

x 表示互换模板块中的文本和缓冲区中的文本。

y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)

\1 子串匹配标记

& 已匹配字符串标记

[[email protected] tmp]# sed ‘s#o#@#‘ person.txt

101,@ldboy,CEO

102,[email protected],CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[[email protected] tmp]# sed ‘s#o#@#g‘ person.txt

101,@[email protected],CEO

102,[email protected],CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

变量替换

[[email protected] tmp]# x=1

[[email protected] tmp]# echo "$x"

1

[[email protected] tmp]# y=2

[[email protected] tmp]# sed "s#$x#$y#g" person.txt

202,oldboy,CEO

202,zhangyao,CTO

203,Alex,COO

204,yy,CFO

205,feixue,CIO

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

[[email protected] tmp]# sed -n ‘2p‘ person.txt

102,zhangyao,CTO

[[email protected] tmp]# sed -rn ‘/oldboy|yy/p‘ person.txt

101,oldboy,CEO

104,yy,CFO

企业案例:批量重命名文件

[[email protected] tmp]# touch  stu_102999_{1..5}_finished.jpg

[[email protected] tmp]# ll

total 8

-rw-r--r--. 1 root root 40 Feb 22 16:07 num.txt

-rw-r--r--. 1 root root 71 Feb 22 15:58 person.txt

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_1_finished.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_2_finished.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_3_finished.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_4_finished.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_5_finished.jpg

 

[[email protected] tmp]# ls stu*|sed -r ‘s#(.*)(_finished)(.*)#mv & \1\3#g‘

mv stu_102999_1_finished.jpg stu_102999_1.jpg

mv stu_102999_2_finished.jpg stu_102999_2.jpg

mv stu_102999_3_finished.jpg stu_102999_3.jpg

mv stu_102999_4_finished.jpg stu_102999_4.jpg

mv stu_102999_5_finished.jpg stu_102999_5.jpg

[[email protected] tmp]#ls stu*|sed -r ‘s#(.*)(_finished)(.*)#mv & \1\3#g‘|bash

[[email protected] tmp]# ll

total 8

-rw-r--r--. 1 root root 40 Feb 22 16:07 num.txt

-rw-r--r--. 1 root root 71 Feb 22 15:58 person.txt

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_1.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_2.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_3.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_4.jpg

-rw-r--r--. 1 root root  0 Feb 22 21:18 stu_102999_5.jpg

 

 

 

 

 

以上是关于sed命令的使用的主要内容,如果未能解决你的问题,请参考以下文章

linux 特殊符号怎样用sed替换

如何使用sed命令使用正则表达式过滤文件?

sed 错误:sed:-e 表达式 #1,字符 22:未终止的 `s' 命令

sed命令取消注释代码行

如何用sed命令替换一行中的某个字符串

如何使用sed搜索和替换]、[? [关闭]