linux学习笔记——sed

一、简介
sed (stream editor), 流编辑器,即用程序的方式编辑文本,与vim编辑不同,它是一种非交互式编辑器,它使用预先设定好的编辑指令对输入的文本进行编辑,一次处理一行内容,处理时把当前行存储在临时缓冲区中,称为“模式空间”(pattern space),处理完后把结果送往屏幕,紧接着处理下一行。
二、选项与指令
1、选项
sed 可以使用行号和正则尽进行匹配,如果不指定行号或正则表达式,默认在整个文件中进行匹配
-e 是编辑命令,用于sed执行多个编辑任务的情况下,在下一行开始编辑前,所有的编辑动作都应用到模式空间中的行,即对某行进行多个编辑任务
-f 执行一个sed脚本文件中的指令,如:sed -f scriptfile file
-n 屏蔽默认输出,sed默认会把读取到的文件的全部内容输出到屏幕
-r 让sed支持扩展正则
-i 直接更改源文件,默认sed知识更改内存中得到文件,源文件无影响
2、指令
p (print) ,打印,输出
d (delete) 删除
s (substitude) 替换
c 替换(对资料区,资料行的操作)
i (inert) 在行前插入 (对资料区,资料行的操作)
a (append) 在行后追加 (对资料区,资料行的操作)
三、实例
以下实例操作文件名称为test.txt
1、关于 p
sed -n ‘p’ test.txt #打印整个文件,相当于cat
sed -n ‘2p’ test.txt #打印第二行
sed -n ‘1,8p’ test.txt #打印1-8行
sed -n ‘4,+7p’ test.txt #打印第4行及其后的7行内容
sed -n ‘/^echo/p’ test.txt #打印所有以echo开头的行
sed -n ‘$=’ test.txt #输出文件行号,$ 代表尾行,= 表示显示行号,实际为输出尾行行号
sed -n ‘/\$/p’ test.txt #打印含有$的所有行,\ 为转义符
sed -n ‘7,/python/p’ test.txt #只在第7行查找python并打印
sed -n ‘/root/=’ test.txt #打印有root 的行的行号
sed -n ‘/$/=’ test.txt #打印所有行号
2、关于 d
sed ‘3d’ test.txt #删除第三行
sed ‘5,8d’ test.txt # 删除5-8行
sed ‘/div/d’ test.txt # 删除所有包含div的行
sed ‘/div/!d’ test.txt #删除所有不包含div的行
sed ‘/^echo/d’ test.txt #删除以echo开头的行
sed ‘$d’ test.txt #删除最后一行
sed ‘/^$/d’ test.txt #删除所有空行(以空开头,以空结尾)
3、关于s ———— 注:不管什么字符,紧跟着s指令的都被认为是新的分隔符,在修改文件路径时可以将/替换为其他,如:#
sed ‘s/xml/XML/’ test.txt #将每行第一个xml替换为XML
sed ‘s/xml/XML/3’ test.txt #将每行中的第三个xml替换为XML
sed ‘s/xml/XML/g’ test.txt #将每行中所有的xml替换为XML,g表示在整行进行匹配
sed ‘s/xml//g’ test.txt #将所有xml都删除,即将xml替换为空
sed ‘s#/bin/bash#/sbin/bash#g’ #将/bin/bash 替换为/sbin/bash,此处分隔符为#
sed ‘5,9s/^/#&/’ test.txt #将第5-9行注释,即开头加上#,&表示字符的相加
sed ‘s/^#python/python/’ test.txt #取消以python开头的行注释
sed ‘s9\97\98\99\9\98\99’ test.txr #将97989替换为9989,9为分隔符,匹配数字9,用\9
sed ‘s/xml/XML/p’ test.txt #将每行中的第一个xml替换为XML并打印该行
sed ‘3s/xml/XML/4’ test.txt #将第三行的第四个xml替换为XML
sed -n ‘3s/xml/XML/4p’ test.txt # 将第三行的第四个xml替换为XML,并打印改行,-n 与 p连用表示只打印发生替换的行
sed ‘s/[ ][ ]/[ ]/g’ test.txt #将两个或多个空格替换为一个空格
sed 's/[ ][ ]
/:/g’ test.txt #将连个或多个空格替换为:
sed ‘1,5!s/^bin/#!bin/g’ test.txt #将不是1-5行的其他以bin 开头的行替换为#!bin
sed ‘s/.$//’ test.txt #删除文件每行的最后一个字符
sed ‘s/…$//’ test.txt #删除文件每行的最后两个字符
sed ‘s/^.//’ test.txt #删除文件每行的前面一个字符
sed ‘s//.$//’ test.txt #删除以句点结尾的行,/.表示句点
sed ‘s/^/[][][][]&/’ test.txt #每行行首加上四个空格
sed ‘s//.//g’ test.txt #删除所有句点 /.表示句点
sed ‘s/col/(…/)//g’ test.txt #删除紧跟col的后三个字符
sed ‘s/^g’ test.txt #删除第一个/ ,匹配/ 用//
sed ‘$s/$/&,/’ test.txt #在尾行的行尾加上,
sed ‘s/’ " ’ " ’ //g’ test.txt #将单引号替换为空
sed ‘s/’\"//g’ test.txt #将单引号替换为空
sed ‘s/\’//g’ test.txt #将单引号替换为空
sed ‘s/xml//2 ; s/.$//’ test.txt = sed ‘s/xml//2’ | sed ‘s/.$//’ test.txt # 删除每行的第二个xml与最后一个字符
将单引号替换为双引号的三种方式:
(1)、sed ‘s/’’’’’’/’’’’’/g’ test,txt
‘s/’:替换操作紧跟匹配字符
‘’’’’:用双引号包着单引号
/:分割符
‘’’’:用单引号包着双引号
‘/g’:分割符,全局替换
(2)、sed s#\’#\"#g test.txt
#:分割符
\’ , \“匹配单引号和双引号用\转义
(3)、“s/’/\”/g” test.txt
\" :匹配双引号用\转义
4、关于c,i,a
sed ‘1c #!bin/more’ test.txt #将第一行替换为#!bin/more
sed ‘nc hello world’ test.txt #将第n行替换为hello world
sed ‘1,10c hello world’ test.txt #将第1-10行替换为hello world
sed ‘1,10c hello\nworld’ test.txt #将1-10行替换为两行
sed ‘3a hello world’ test.txt #在第三行后插入hello world
sed ‘3i hello world’ test.txt #在第三行前插入hello world
sed ‘1,10a hello world’ test.txt #在第1-10行后插入hello world
sed ‘3a hello\nworld’ test.txt #在第三行后追加两行
sed ‘$a bye’ test.txt #最后一行添加bye
sed -e ‘1,10d’ -e ‘s/xml/XML/g’ test.txt #第一重编辑将1-10行删除,第二重将xml替换为XML

$与指令相连,即在分割符外表示尾行,在分割符内表示行尾
^在分割符内表示行首或以某字符开头

sed 指令补充:
| :列出非打印字符
n:读入下一输入行,并从下一条命令而不是第一条命令开始对其进行操作
q:结束或退出sed,sed的退出模式不像grep,不管是否指到指定模式,他的退出状态都为0,只有存在语法错误的时候sed退出状态才不为0
r:从文件中读取输入行
!:对所选行以外的所有行进行操作
w:将所选行写入文件
x:交换暂存缓冲区与模式空间的内容
y:将字符替换为另一个字符(不能对正则表达式使用y命令)

a\ :是追加命令,将添加新文本到到当前行的后面,如果要追加的内容超过一行,则每一行都必须以反斜线结束,表示续行,最后一行除外,最后一行则以引号和文件名结束
sed ‘/^hello/a\hello world!!!\just do it’ test.txt #在以hello开头的行的下方添加两行hello world !!! 和 just do it
i\:在当前行的前面插入新的文本
sed ‘/^hello/a\just do it’ test,txt
c\:将已有文本替换为新文本
n :sed 使用该命令获取文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配紧接着的下一行上
sed ‘/hello/{n;s/My/Your/;}’ test.txt
注:如果需要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号将命令括起来,每行只写一条命令,或分号分割同一行的多条命令。
y:该命令与Unix,linux中的tr命令相似,字符按照一对一的方式从左到右进行转换
sed ‘1,20y/hello12/HELLO^$’ test.txt # 将1-20行内所有的h-H,e-E,l-L,o-O,1-^,2-$
q:q命令将导致sed程序退出,不在进行其他处理
sed ‘/hello/{s/hello/HELLO/;q;}’ test.txt
r:r命令,读命令,sed 使用该命令将一个文本文件中的内容加到当前文件的特定位置上
sed ‘/My/r introduce.txt’ test.txt #如果在文件test.txt中匹配到某行含有My,则在该行后读入文件introduce.txt的内容,如果出现My的行不止一行,则在每行后都读入
w:匹配到某行并写入文件
sed ‘/My/w me.txt’ test.txt # 如test.txt 中能匹配到My的行,将其写入文件me.txt

sed 与正则表达式元字符:
与grep一样,sed 也支持特殊元字符来进行模式查找,替换,不同的是,sed使用的正则表达式是扩在/之间的模式,若如要把正则表达式分割符改为其他字符,比如o,只要在这个字符前加上反斜杠\,在字符后跟上正则表达式,再跟上这个字符即可,如:
sed -n ‘\o^Myop’ test.txt
^:行首定位符
$:行尾定位符,也可表示尾行 /boy$/
.:匹配除换行符以外的单个字符 /m…y/ 包含字母m后跟两个字符再跟y的行
*:匹配0个或多个前导字符 /my*/ 包含字母m后跟0个或多个y的行
[ ]:匹配指定字符组内的任一字符 /[Mm]y/ 匹配包含My 或my的行
[ ^]:匹配不在指定字符组内的任一字符 /[^Mm]y/ 包含y,但y前的字符不是M与m
&:保存查找串,以便在替换中引用,s/my/**&**/ , &为查找串,my 将被替换为 **my**
\<:词首定位符,/\<my/,查找已含有以my开头的单词的行,即只要某行中的某个单词以my开头,都将匹配
\>:词尾定位符/\>my/
x\{m\}:连续m个x , /9\{5\}/ 匹配包含连续5个9的行
x\{m,\}:至少连续的m个x
x\{m,n\} :匹配至少m个,至多n个,但不超过n个连续的x的行

sed脚本:
后序补充

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值