您的位置:首页 > 运维架构 > Linux

sed基础用法

2016-08-18 11:36 295 查看
在linux系统中,sed的文本处理无疑是一个非常强大的工具,用好sed可以使我们工作效率成倍提升,下面就小结一下sed的常用命令参数,只需关注常用的即可。

选项参数

首先来一发sed --help了解一下常用的参数
# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

-n 忽略打印输出,一般是避免默认输出,只有我们处理的那一行文本会显示在屏幕上
-e 在命令行进行文本的处理动作
-f 后接脚本文件之类,类似于上面的-e参数,只是将执行的命令放到了一个指定的文件中
-i 修改文件内容
-c 当使用上面的-i参数修改文件内容时,为了防止修改错误,会自动生成一个和原始文件内容相同且以c结尾的备份文件
-l 后接数字,指定一行的长度
-r 使用正则表达式

命令参数

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(默认是偶数行,a前面可以指定行号)
c :替换, c 的后面可以接字符串,这些字符串会整行替换掉匹配的行。
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列号,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,常用的替换字符操作,如 ‘s/aa/bb/g’ ,用于替换匹配的字符。

示例:
# a 新增
[root@localhost ~]# sed '3axxxxx' t
1
2
3
xxxxx #在第三行后增加指定内容
4
5
[root@localhost ~]# sed '2,4axxxxx' t
1
2
xxxxx #在2-4行后每行增加指定内容
3
xxxxx
4
xxxxx
5

# c 替换某一行内容,可以指定行号,也可以匹配内容
[root@localhost ~]# for n in {1..6};do echo "aa$n" >>test.txt;done
[root@localhost ~]# sed '2cxxxxx' test.txt
aa1
xxxxx  #替换掉指定行的内容
aa3
aa4
aa5
aa6
[root@localhost ~]# sed '2,5cxxxxx' test.txt
aa1
xxxxx  #替换多行
aa6
[root@localhost ~]# sed '/aa3/cxxxxx' test.txt
aa1
aa2
xxxxx  #指定内容匹配替换
aa4
aa5
aa6

# d 删除,可以匹配行号或者内容
[root@localhost ~]# sed 3,5d test.txt
aa1
aa2    #删除3-5行的内容
aa6
[root@localhost ~]# sed /aa5/d test.txt
aa1
aa2
aa3
aa4
aa6

# i 插入内容
[root@localhost ~]# sed '2ixxxxx' test.txt
aa1
xxxxx  #在第二行之前插入指定内容
aa2
aa3
aa4
aa5
aa6
[root@localhost ~]# sed '3,5ixxxxx' test.txt
aa1
aa2
xxxxx  # 3-5行每行前插入指定内容
aa3
xxxxx
aa4
xxxxx
aa5
aa6

# p 打印输出指定的行或内容,不加参数-n会多出一个全局输出
[root@host6 ~]# sed -n 2p aaa.txt
aabb2
[root@host6 ~]# sed -n 2,4p aaa.txt
aabb2
aabb3
aabb4
[root@host6 ~]# sed -n /aabb3/p aaa.txt
aabb3

# s 取代匹配的字符
[root@host6 ~]# sed s/bb3/xx3/ aaa.txt
aabb1
aabb2
aaxx3   #替换指定内容
aabb4
aabb5
aabb6
除了上面的这一些最基础的用法外,sed 还支持跟加复杂的高级匹配,支持正则,变量和多个匹配字符(address)的匹配。

sed 指定行范围内匹配
[root@host6~]# sed -i '1, /test/ s#123#888#g' test.txt
[root@host6~]# cat test.txt
test 888
test 888
test 123
test 123

#适合多次过滤匹配,用于筛选条件较多的场景
[root@host6 ~]# cat test.txt
aabb111
aacc222
bbdd111
bbcc222
zzaa333
eevv111
bbcc222111cvcv
[root@host6 ~]# sed '/^bb/ s/222/000/'  test.txt
aabb111
aacc222
bbdd111
bbcc000
zzaa333
eevv111
bbcc000111cvcv

#匹配第六行后三行,符合条件的文本内容
[root@host6 ~]# sed  '6,/^bb/ s/222/000/' test.txt
aabb111
aacc222
bbdd111
bbcc222
zzaa333
eevv111
bbcc000111cvcv


sed中引用shell变量的四种方法
在使用sed引用变量时可能会出现不成功的情况,下面这些规则能让我们更好的使用sed变量
eval sed ’s/$a/$b/’ filename
sed "s/$a/$b/" filename
sed ’s/’$a’/’$b’/’ filename
sed s/$a/$b/ filename

简单正则匹配字符的方法
$表示匹配结尾,^ 表示匹配开头, &表示前面匹配的内容,= 表示输出行号。
'/\.$/d' 删除以句点结尾行
's/[[:space:]]/ /' 删除一个以上空格,用一个空格代替
'/^[[:space:]]/d' 删除行首空格
's/[[:space:]]\+//' 删除空格
'/^$/d' 删除空行
's/^.//' 删除第一个字符,包括空格

以上只是sed的一些基础用法,在实际应用中一般都比这个复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 表达式 sed