加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

sed命令和正则表达式

发布时间:2020-12-13 23:46:59 所属栏目:Linux 来源:网络整理
导读:sed命令和正则表达式 sed是一种在线的,非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为模式空间,接着用sed命令处理缓冲区的内容。处理完,把缓冲区的内容送往屏幕。 sed支持正则表达式 与grep一样,sed在文件中查
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键(制表符)
[[email?protected] ~]# sed -r ‘s/root/alice/‘ passwd             #替换每行第一个root为alice
[[email?protected] ~]# sed -r ‘s/root/alice/g‘ passwd           #替换每行root为alice
[[email?protected] ~]# sed -r ‘1s/root/alice/g‘ passwd        #只替换第一行的root为alice,想替换几行可以换成1,ns即可
[[email?protected] ~]# sed -ri ‘s/(^[sl])/#1/‘ passwd          #将以s或者l开头的行作为一个组,替换时在前面加#,1是调用前面组的内容
[[email?protected] ~]# sed -r ‘s/^#//‘ passwd           #将以#开头的行去掉#号
[[email?protected] ~]# sed -r ‘s/^[ |t|#]*$/test/‘ passwd       #以空格或tab或#号或空行开头的行,替换为为test
[[email?protected] ~]# sed -r ‘s#/var#/opt#‘ passwd        #这里替换一个目录带/,那么可以将替换的/换成#,看起来更清晰

追加命令a

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

替换命令c

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

删除命令d

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

小扩展:sed选项-e

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读