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==>这里g是s命令的替换标志,注意和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} |
对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行 |
/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命令的使用的主要内容,如果未能解决你的问题,请参考以下文章