Linux-sed用法

1.sed和vim的区别

sed(Stream Editor)是一种非交互式的行编辑器
vim 是交互式的文本编辑器

  • sed是以换行符以分隔单位,对文本进行逐行的处理。处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
  • 文件内容并没有改变,除非你使用重定向存储输出。
  • sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

2. sed参数

用法:sed [选项] [动作] [filename]

选项说明
-n组织默认输出,一般和动作p一起使用打印模式空间的内容
-e多个操作
-i直接修改源文件
-r动作中支持扩展正则表达式
-f将sed脚本卸载一个文件中, sed -f sedscript filename 可以加载执行sed命令
动作说明
s直接进行替换(搭配正则表达式),例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行
aappend后面接字串,在下面新增一行
iinsert后面接字串,在上面插入一行
ddelete,删除行,后面不接任何参数,直接删除地址表示的行
c取代行后面接字串
pprint,打印模式空间的内容,通常和选项 -n一起使用
wwrite,将模式空间的内容写入到文件

3. sed使用

1. 替换行内部分内容

  1. sed 's/old/new/【参数】 ' filename

替换命令中一般用/作为分隔符,也可以用其他符号替代,s后面就是分隔符,例如sed -i 's#11#99#' 1.txt

# -i 选项是直接修改了源文件
sed -i 's/af/bbbb' 1.txt  #每一行中只替换第1个af,该行后面的af不替换
sed -i 's/af/bbbb/2' 1.txt #每一行中只替换第2个af,该行后面的af和第一个不替换
sed -i 's/af/bbbb/g' 1.txt # 每一行中所有的af都将被替换成bbbb

#替换中有普通元字符
sed 's/^root//' 1.txt #匹配以root开头的那一行,并将root删掉
sed 's/ab*/5555/' 1.txt #匹配一行中a开头后面的b出现0次或者多次,将其替换成5555

#替换中有扩展元字符(+,?,管道符),需要加上-r
sed -r 's/ab+/5555/' 1.txt #匹配一行中a开头后面的b出现1次或者多次,将其替换成5555
sed -r 's/ab?/5555/' 1.txt #匹配一行中a开头后面的b出现0次或者1次,将其替换成5555
sed -r 's/a|b/5555/' 1.txt #匹配一行中的a或者b,将其替换成5555
sed -r 's/(aa)|(bb)/5555/' 1.txt #匹配一行中的aa或者bb,要用括号括起来表示分组,将其替换成5555
sed -r 's/(aa)|(bb)/\1\2/' 1.txt #分组还有个sed回调的功能,\1,\2就是再次引用aa和bb,放到被替换的位置

  1. 寻址匹配替换(默认是对每行进行操作,增加寻址后对匹配的行进行操作)
    sed '行号s/old/new/[参数]' filename
    sed '/正则表达式/s/old/new/[参数] ' filename
1.行号
sed '1s/af/bbbb/' 1.txt #只在第1行匹配做替换

#-n选项和标志位p,只打印替换成功的行
sed -n '1,3s/af/bbbb/p' 1.txt    #第1至3行匹配做替换

#标志位w将替换成功的行写入到a.txt中
sed '1,$s/af/bbbb/w' 1.txt /tmp/a.txt #第1行到最后一行做匹配替换并将替换成功的行写入到 a.txt中

2.正则表达式
sed '/root/s/af/bbbb/' 1.txt #匹配有root的一行将改行的af替换成bbbb
sed '/^bin/s/af/bbbb/' 1.txt #匹配以bin开头的那行,将该行的af替换成bbbb
sed '/^bin/,$s/af/bbbb' 1.txt #匹配以bin开头到最后一行的,每一行第一个替换成bbbb

3.寻址可以匹配多条命令
sed '/bin/{s/a/b/;s/1/2/;=}' 1.txt #匹配有bin的行,将该行中a替换成b,1替换成2
#打印行号命令=

在这里插入图片描述
在这里插入图片描述

2. 删除

删除模式空间内容,改变脚本的控制流,读取新的输入行
意味着d后面的脚本不会被执行

sed '[寻址]/d' filename
sed '/ab/d' 1.txt  # 删除的是有ab一整行,并不是删除ab两个字符
sed '/ab/d;s/a/n/' 1.txt 
#删除有ab的一行后,后面的将改行的a替换成n这条命令是不会被执行的,
#因为d删除过后就读取了新的输入行,改变了脚本的控制流,后面的命令不会被执行 

3 .插入和改写

sed '/ab/i hello' 1.txt  #在匹配ab的行的上一行插入hello
sed '/ab/a hello' 1.txt  #在匹配ab的行的下一行插入hello
sed '/ab/c hello' 1.txt  #将匹配的ab那一行改写成hello

4.读文件,写文件,打印退出

读文件命令r
写文件命令w
下一行命令n
打印行号=
打印命令p
退出命令q

sed '/ab/r afile' 1.txt  #如果想要改写的字符串很长,可以写在afile里面,用r将匹配ab的那一行用afile的内容改写
sed '/ab/r afile' 1.txt > /tmp/2.txt  #读取afile的内容来改写1.txt中匹配的ab的那一行,并将结果追加到2.txt中
# 打印文件中1-10行,用p和q,谁的效率更高??
$ seq 1 1000000 > lines.txt     #seq指令创建1-1000000并递增
$ wc -l lines.txt      #wc看文件行数
1000000 lines.txt

$ time sed -n '1,10p' lines.txt    #time查看运行时间  p打印1-10行,后面的还是会读入缓存区
real	0m0.044s  
  
$ time sed '10q' lines.txt       #time查看运行时间   q是到第10行就退出,后面就不会再读取了
real	0m0.004s

4. sed多行模式空间

为什么要有多行模式?
配置文件一般为单行出现,但是也有使用XML或者JSON格式的配置文件,为多行出现,例如key和value,key在一行,value在另外一行。

多行模式
N追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功,则放弃之后任何命令
P打印模式空间中的第一个字符到第一个换行符
D删除当前模式空间开端至\n的内容,放弃之后的命令,但是对剩余模式空间重新执行sed。
n提前读取下一行 ,覆盖模型空间前一行,如果命令未执行成功,则放弃之后的任何命令
p打印当前模式空间内容,追加到默认输出之后
d删除当前模式空间内容,并放弃之后的命令,并对新读取的内容,从头执行sed。
y字符转换:y/abcde/ABCDE/ :将字符转换成大写

在这里插入图片描述
在这里插入图片描述

案例

  1. 从文件中读取偶数行 sed -n 'n;p' 1.txt
$ cat 1.txt
111
222
333
444
555

$ sed -n 'n;p' 1.txt
222
444
#读取第一行111,执行n命令提前读取下一行就是222,此时模式空间的值为222,再执行p,打印模式空间的222
#之后读取333,执行n命令,此时模式空间为444,p打印444
#之后读取555,执行n命令,没有下一行了,n命令未执行成功,后面的p命令就放弃执行了。
  1. 从文件中读取奇数行 sed -n '$!N;P' 1.txt
$ sed -n '$!N;P' 1.txt   #大写的P哦
111
333
555
#先读取111,$!(不是最后一行)条件满足,执行N命令此时模式空间值为111\n222,执行P命令,打印第一行到\n,结果为111
#再读取333,$!条件满足,执行N为333\n444,执行P,打印333
#再读取555为最后一行,$!条件不满足,跳过N命令,执行P,打印555
用d也可以实现读取奇数行
$ sed 'n;d' 1.txt
111
333
555
#先读取111,执行n,模式空间为222,执行d,删除此时模式空间的222
#再读取333,执行n,此时模式空间值为444,执行d,删除444
#再读取555,执行n命令,没有下一行了,n命令未执行成功,后面的d命令不执行
#因为没有-n参数,所以输入111\n333\n555
  1. 从文件中读取最后一行 sed 'N;D' 1.txt
$ sed 'N;D' 1.txt
666
#N将下一行追加到模式空间中
#执行N,此时模式空间为111\n222,执行D得222,
#执行N,此时模式空间为222\n333,执行D得333,
#执行N,此时模式空间为333\n444,执行D得444,
#执行N,此时模式空间为444\n555,执行D得555,
#再执行N,没下一行追加了执行失败,后面D不执行,无-n选项,最后结果就是555

5. sed保持空间

保持空间也是多行的一种操作方式
将内容暂存在保持空间,便于多行处理

保持空间
h将当前模式空间中内容覆盖至保持空间,原来模式空间的内容被清空
H将当前模式空间中的内容追加至保持空间
g将当前保持空间中内容覆盖至模式空间,原来模式空间的内容被清空
G将当前保持空间中的内容追加至模式空间
x换模式空间和保持空间内容
  1. 实现行数反转
head -6 /etc/passwd | cat -n | tac
cat -n /etc/passwd | head-6 |sed -n '1h;1!G;$!x;$p' 
cat -n /etc/passwd | head-6 |sed -n '1!G;h;$p' 
cat -n /etc/passwd | head-6 |sed '1!G;h;$!d' 
# 1!G:第1行不执行“G”命令,从第2行开始执行
# $!d:最后一行不删除(保留最后1行)
  1. 行列转化
$ cat 1.txt
111
222
333
444
555
666
$ sed -ne 'H;${x;s/\n/ /g;p}' 1.txt
 111 222 333 444 555 666
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值