码迷,mamicode.com
首页 > 其他好文 > 详细

sed命令和正则表达式

时间:2019-06-21 17:09:28      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:元字符   实例   屏幕   编辑   意思   调用   显示   默认   引用   

sed命令和正则表达式

sed是一种在线的,非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为模式空间,接着用sed命令处理缓冲区的内容。处理完,把缓冲区的内容送往屏幕。
sed支持正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,>用于查找和替换,以下是sed支持的元字符
使用基本元字符集 ^ $ [] [^] \<\> () {}
使用扩展元字符 ?+ {} | ()

sed命令:

告诉sed对指定行进行何种操作

命令    功能
a       在当前行后添加一行或多行
c       用新文本修改(替换)当前行中的文本
d       删除行
i       在当前行之前插入文本
l       列出非打印字符
p       打印行
n       读入下一输入行,并从下一条命令而不是第一条命令处理
q       结束或退出sed
!       取反
s       用一个字符串替换另一个字符串
      s 替换标识
      g 全局替换
      i 忽略大小写
r       从文件中读
w       将行写入文件
y       将字符转换成另一字符(不支持正则表达式)
h       把模式空间里的内容复制到暂存缓冲区

选项

选项 功能

-e      允许多项编辑
-f      指定sed脚本文件名
-n      取消默认的输出
-i      inplace 直接修改
-r      支持扩展元字符

示例:

head -10 /etc/passwd > passwd       #取/etc/passwd做演示
# sed ‘‘  passwd (这里将passwd中的内容放到模式空间处理,因为没有执行任何命令,所以原封不动的返回值)
# sed ‘d‘ passwd  (读到每一行都执行删除的操作,所以不返回任何值)
# sed ‘1,9d‘ passwd  (读1-9行的内容,然后删除,最后输出的就只剩第十行)
# sed -r ‘p‘ passwd  (内容会重复两次,因为到模式空间处来会打印一次。然后print会再打印一次)
# sed -rn ‘p‘ passwd (以静默的方式显示,进入模式空间被命令处理过的可以输出,原先内容就不输出)
# sed -rn ‘/root/p‘ passwd (打印带root的行)
# sed -rn ‘/^[rot]/p‘ passwd (打印包含r,o,t开头的行)
# sed -rn ‘/^[^root}/p‘ passwd (打印不包含以r,o,t开头的行)
# sed -r ‘s/root/alice/‘ passwd  (替换root为alice,只替换了每行第一个)
# sed -r ’s/root/alice/g‘ passwd  (全局替换,都改)
# sed -r ‘s#/sbin/nologin#/bin/ok#‘ passwd    (使用#号或者@也可以,一般是带有/的 替换目录之类的操作,看起来更清晰)

sed常用命令实例:

替换命令s

扩展: ^$代表空行   空格直接敲就行  \t代表tab键(制表符)
[root@localhost ~]# sed -r ‘s/root/alice/‘ passwd             #替换每行第一个root为alice
[root@localhost ~]# sed -r ‘s/root/alice/g‘ passwd           #替换每行root为alice
[root@localhost ~]# sed -r ‘1s/root/alice/g‘ passwd        #只替换第一行的root为alice,想替换几行可以换成1,ns即可
[root@localhost ~]# sed -ri ‘s/(^[sl])/#\1/‘ passwd          #将以s或者l开头的行作为一个组,替换时在前面加#,\1是调用前面组的内容
[root@localhost ~]# sed -r ‘s/^#//‘ passwd           #将以#开头的行去掉#号
[root@localhost ~]# sed -r ‘s/^[ |\t|#]*$/test/‘ passwd       #以空格或tab或#号或空行开头的行,替换为为test
[root@localhost ~]# sed -r ‘s#/var#/opt#‘ passwd        #这里替换一个目录带/,那么可以将替换的/换成#,看起来更清晰

追加命令a

#变量var=666666
#使用a追加变量的时候使用双引号,而不是单引号,单引号强引用,会去掉$var原本的含义,而不是我们的变量
[root@localhost ~]# sed -ri ‘1a test1‘ passwd     #在第一行后追加test1
[root@localhost ~]# sed -ri ‘$a test$‘ passwd     #在最后一行追加test$
[root@localhost ~]# sed -ri ‘1,4a test$‘ passwd  #在1-4行后追加test$
[root@localhost ~]# sed -ri "2a $var" passwd    #在第二行后追加$var
[root@localhost ~]# sed -ri "\$a $var" passwd   #在最后一行追加$var,加\是为了转义,让$a就是最后一行的意思

替换命令c

#与s替换大同小异,用新文本修改(替换)当前行中的文本,但这种替换需要准确内容,只有要相同的内容就统统改
[root@localhost ~]# sed -ri ‘/6666/c7777‘ passwd     #替换6666为7777
[root@localhost ~]# sed -ri ‘/UseDNS no/cUseDNS yes‘ sshd_config    #将UseDNS no替换为UseDNS yes

删除命令d

[root@localhost ~]# sed -ri ‘1d‘ passwd        #删除第一行
[root@localhost ~]# sed -ri ‘1,5d‘ passwd     #删除1,5行
[root@localhost ~]# sed -ri ‘/^#/d‘ passwd    #删除以#号开头的行
[root@localhost ~]# sed -ri ‘/^[ |\t|#]*$/d‘ passwd    #删除带有空格,tab,#,空行开头的行

小扩展:sed选项-e

#一条sed语句中有多个命令的时候需要加-e,也可以用分号代替
[root@localhost ~]# sed -ri -e ‘3,5d‘ -e ‘s/root/alice/‘ passwd
[root@localhost ~]# sed -ri ‘s/root/alice/;3,5d‘ passwd

sed命令和正则表达式

标签:元字符   实例   屏幕   编辑   意思   调用   显示   默认   引用   

原文地址:https://blog.51cto.com/13760226/2412079

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!