linux中往sed命令,Linux中Sed命令怎么用?

Linux中Sed命令怎么用?

发布时间:2020-05-26 17:14:39

来源:亿速云

阅读:245

作者:鸽子

Sed介绍:sed是文本处理工具,读取文本内容,根据指定的条件进行处理如删除、替换、添加等

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。

Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

工作流程图

dfa11a6db94f72d8b68b0f43ffcd47ec.png

Sed三大功能:1.读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中;

2.执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行;

3.显示:发送修改后的内容到输出流,再发送数据后,模式空间将会被清空。

注意:默认情况下,所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

Sed命令两种格式:其中,“参数”是指操作的目标文件,当存在多个操作对象时用,文件之间用逗号“,”分隔;而 scriptfile 表示脚本文件,需要用“-f”选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。

sed [选项] ‘操作’ 参数

sed [选项] -f scriptfile 参数

常见的 Sed命令选项:语法:sed [options] [script] [inputfile]

-e :允许执行多个脚本;

-f :从脚本文件中读取命令;

-h :显示帮助;

-n :取消默认输出;

-i :直接修改原始文件;

-l:  指定行长度;

-u: 最低限度的缓存输入和输出

-r:在脚本中使用正则表达式

常见的操作选项:a:增加,在当前行下面增加一行指定内容;

c:替换,将选定行替换为指定内容;

d:删除,删除选定的行;

i :插入,在选定行上面插入一行指定内容;

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,通常与 -n选项一起使用;

s :替换,替换指定字符;

y :字符转换;

Sed 元字符集^: 匹配行开始,如:/^sed/匹配所有以sed开头的行。

$ : 匹配行结束,如:/sed$/匹配所有以sed结尾的行。

. : 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

: 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

[] : 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。

[^] : 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

(..) : 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。

& : 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。

\< : 匹配单词的开始,如:/\

\> : 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。

x{m} : 重复字符x,m次,如:/0{5}/匹配包含5个0的行。

x{m,} : 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。

x{m,n} : 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

Sed 常用操作

选择文本

5d171e82591382665b2d2e7680a4a136.pngsed -n 5p aa.txt

38a56c8dc4ea745363ea70e21e7a5064.pngsed -n '2p,5p' aa.txt  #选择第2到第5行

595a76b86f592c4d4dfb7d22385923ca.pngsed -n '2p;5p' aa.txt   #选择第2和第5行

91e015024b3b6a77e1ac62a47cd8ec68.pngsed -n '/^5/p' aa.txt  #以5开头的行

011b12a0b7f6478ba4f4dc68c56df311.pngsed -n '$p' aa.txt  #打印最后一行

9d345c98de649cc15735b829a8f9ec5d.pngsed -n '1~2p' aa.txt   #表示从第一行开始,没个行就打印出来

c38359de23891c7b3b45ce6c93f6af73.pngsed -n '/cc$/p' aa.txt   #以cc结尾的行

42a1ecfa94cfcfad870665b6705cb721.pngsed -n '/fff/,10p' aa.txt   #表示从含油字符串fff到第10行打印

f5ae312403eb469b9f27ef6cea59f936.png

备注:加上-n只显示出来,不会改变原文件,若要改变原文件,加上sed -i 。

替换文本g : 获得内存缓冲区的内容,并替代当前模板块中的文本。

p : 打印模板块的行。

w : file 写并追加模板块到file末尾。

例子:sed 's/e/E/' aa.txt

d6688cbed21f985b371ff4a69c7ba757.pngsed 's/e/E/g' aa.txt   #全文中e都替换成E

cf0a8c9aaa68e2a372ef3dc4d196c9ca.pngsed '1,5s/e/E/g' aa.txt  #第一行到第5行间e都替换成E

c6f39918f09cec350d1aca23cf99d646.pngsed '6,/^6/s/f/E/g' aa.txt #以6开头的行f都替换成E

65aa2fd7397d564b8d393c936caba63a.png

sed '/^6/s//E/g' aa.txt   #以6开头的行都替换成E

b5aea612854f6fee1f9e5ea8e1a53bd1.png

备注:后面不加上g,只会替换每行第一次会出现的字符串,sed 不会改变原文件,参数之间不一定非要使用斜线分割,也可以使用除空格,换行外的任意字符若要改变原文件,加上 -i 。

删除文本sed -e '3d' aa.txt  #删除第三行

b8ffc99df387082f0df06361d5a8f539.pngsed -e '3,5d' aa.txt #删除3到5行

ffcddfde4936275110e1d8c4bd8195de.pngsed -e '$d' aa.txt  #删除最后一行

b8be552352080a02e510f912245f1555.pngsed -e '1d;5d' aa.txt  #删除1,5行

30409a9b0b27d8caba560e7f3dd4f919.pngsed -e '1~2d' aa.txt #删除奇数行

96899256144839035ecd3033d90e190f.pngsed -e '0~2d' aa.txt  #删除偶数行

b6a80dbd2d9441698f710265eb6cee66.pngsed -e '1,/^6/d' aa.txt  #删除1到以6开头的行

631e3cd7c2ca21fa6bb90b1f663cf0f3.pngsed -e '5,$d' aa.txt  #删除从5行到最后

a0b58b3942a3011af52b82d99fecc386.pngsed '^$d' aa.txt  #删除空白行

备注:删除原文件内容要加上-i

追加文本sed '3a20200229' aa.txt  #第三行后追加

766d1bc29498f963777a27203c26f22d.pngsed '/^8/a2020008' aa.txt  #以8开头的行后追加

f0b67741cc0cb49348837b187ff2730d.png

备注:使用echo也可以追加,但> ,>>不一样。echo  "9988" >>aa.txt   在文本最后追加,

等于sed '$a9988' aa.txt

echo -e "999" >aa.txt  直接覆盖原文

插入文本sed '3i2128' aa.txt  #第三行插入

3f1ad7eb3d59fa29785cc0c36266da53.pngsed '/^9/i2128' aa.txt  #以9开头行插入

881df6e1d564763866e5129e75e85e74.pngsed '$i2348' aa.txt  #末行插入,实际上是倒数第二行

5640af9578f34fd177f7b77479391451.png

组合命令

1.使用-e选项sed -n -e 's/c/C/g' -e '2,3p' aa.txt

e6929e83698a0e6a5a2df48a172d72c8.png

2.使用分号分割sed -e 's/d/D/g;3i6868p' aa.txt

10a5d7861b9f7104c57f6ce6c154dd78.png

3.对一个地址使用多个子命令sed -n '1,5 {

s/c/C/g

s/e/E/g

2i5566

p

}' aa.txt

f7221276265060d6efcdc761be4e9a37.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值