Linux三剑客之sed

  参考:https://www.cnblogs.com/ftl1012/p/9250171.html

     https://www.runoob.com/linux/linux-comm-sed.html

  sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。

处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。

接着理下一行,这样不断重复,直到文件末。文件内容没有改改变,除非使用了写入的命令,将内容更新。

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

  sed功能命令

命令  功能
a  在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“”续行
 
c  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用""续行
 
i  在当前行之前插入文本。多行时除最后一行外,每行末尾需用""续行
 
d   删除行
 
h   把模式空间里的内容复制到暂存缓冲区
 
H   把模式空间里的内容追加到暂存缓冲区
 
g   把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
 
G   把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
 
l   列出非打印字符
 
p   打印行
 
n   读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
 
q   结束或退出sed
 
r   从文件中读取输入行
 
!   对所选行以外的所有行应用命令
 
s   用一个字符串替换另一个
 
g   在行内进行全局替换
 
w   将所选的行写入文件
 
x   交换暂存缓冲区与模式空间的内容
 
y   将字符替换为另一字符(不能对正则表达式使用y命令)

   sed常见命令参数

p==print 
d:delete
=:打印匹配行的行号
-n 取消默认的完整输出,只要需要的  
-e 允许多项编辑
-i 修改文件内容
-r 不需要转义

   演示使用文件/etc/passwd

  只查看文件的第3行

# sed -n '3p' passwd 
bin:x:2:2:bin:/bin:/usr/sbin/nologin

   PS:需要加参数-n如果不加会在屏幕输出文件所有内容

  只查看第3行到9行

# sed  -n '3,6p' passwd 
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin

   打印最后一行

#sed -n '$p' passwd 
xrdp:x:126:131::/var/run/xrdp:/usr/sbin/nologin

  过滤指定字符串,显示正行内容,例如过滤出root

# sed  -n "/root/p" passwd 
root:x:0:0:root:/root:/bin/bash

   PS:过滤字符串使用//包含p代表打印输出

  仅显示被匹配字符串的行号

#sed -n '/root/=' passwd 
1

   打印匹配的内容和行号,相当于又根据关键词查询了一次

sed -n -e '/root/p' -e '/root/=' passwd 
root:x:0:0:root:/root:/bin/bash
1

   PS:-e允许多项编辑

  在文件的某行后增加一行

#sed   4a
ewline passwd

   会在第4行新增一行后再输出所有

  如果使用参数-n则只在屏幕输出增加的行newline

  删除行

#sed   '1,10d' passwd 

   删除1至10行把剩下的行输出至屏幕

  数据搜索并删除

  删除包含root的行

#sed  '/root/d' passwd

   数据的搜索并替换

  格式如下

sed 's/要被替换的字符串/新的字符串/g'

   把root字符串替换成admin

sed 's/root/admin/g' passwd

   文件的修改

  加参数 -i直接修改文件(危险操作慎用)

  把root替换成admin并且直接修改文件,直接修改屏幕无输出

sed 's/root/admin/g' passwd -i

   如果只是需要替换某一行的在s前面加行号例如

  把第1行的root替换成admin,如果其他行包含root则不会替换

sed '1s/root/admin/g' passwd -i
原文地址:https://www.cnblogs.com/minseo/p/11497497.html