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