写于:2015-09-19		最近一次更新:2017-02-10

Intent:

忽略大小写,我想在使用 sed 命令的时候忽略大小写 不是使用 [aA][bB][cC] 这样的正则表达式 而是像 grep 的 -i 这样一个参数 可是在 man 手册里没有找到类似这样的参数,怎么办?

Oneway:

man sed 没找到需要的信息,注意 SEE ALSO 中的说明 info sed 提供了更全面详细的信息, 在 info sed 中可以找到 I 和 i , 这两个参数,就是用来忽略大小写的, 建议使用 I (大写),用法举例如下 有一个文件 myTestFile ,内容如下 [sman@Slackware:~/Desktop/test] $ cat myTestFile check hah heh test key Key kEy keY KEy KeY kEY KEY hello 我想用 sed 查看包含 key 的所有行, 不管 key 的三个字母是大写还是小写 [sman@Slackware:~/Desktop/test] $ sed -n '/key/I p' myTestFile key Key kEy keY KEy KeY kEY KEY 我想用 sed 把所有行中的 key 统统改成小写 [sman@Slackware:~/Desktop/test] $ sed 's/key/key/I g' myTestFile check hah heh test key key key key key key key key hello 确认无误后,使用 -i 参数把结果修改进 myTestFile 文件里 郑重声明: -i 参数不要与参数 -n 和动作 p 一起使用, 即 -i 与 -n p 不要一起出现,否则原文件中未改动的内容会丢失!!! [sman@Slackware:~/Desktop/test] $ sed 's/key/key/I g' myTestFile -i 来看一下改动后的 myTestFile 文件内容 [sman@Slackware:~/Desktop/test] $ cat myTestFile check hah heh test key key key key key key key key hello 全部改成小写的 key 了

Intent:

有多行满足条件时,在最后一个匹配行的后面增加内容

Oneway:

思路就是找到最后一个匹配行的行号, 然后在该行号后使用 a\ 来添加一行内容,本例 使用了在sed命令中引入外部命令或使用环境变量的方法来完成 “有多行满足条件时,在最后一个匹配行的后面增加内容”的目的

Details:

foo.txt的全部内容如下: aa1 bb1 cc1 bb2 dd1 bb3 ee1 ff1 foo.txt文件中,含有关键词 bb 的行有很多行 我只想在最后一个含有 bb 的那一行之后增加内容Hello Slackware 而不改变其他包含 bb 的行之后的内容 即把foo.txt的内容变成下面这样: aa1 bb1 cc1 bb2 dd1 bb3 Hello Slackware ee1 ff1 现在,用sed命令来实现这个目的 使用引入外部命令的方法: sed ''$(sed -n '/bb/ =' foo.txt | tail -1)'a\Hello Slackware' foo.txt 或者 使用环境变量的方法: MYVAR=$(sed -n '/bb/ =' foo.txt | tail -1);\ sed ''$MYVAR'a\Hello Slackware' foo.txt 备注: sed -n '/bb/ =' foo.txt | tail -1 打印所有包含bb的行的行号,用tail取出最后一个行号 使用'$(commands)'在sed命令中引入外部命令 使用'$ENVVAR'在sed命令中使用环境变量

Intent:

在指定的行范围内进行替换操作

Oneway:

sed -i '36,52s/^..//' test.log 表示删除test.log文件的第36行至52行范围内的所有行的前2个字符(包含第36行和52行)