Linux 文本操作之sed

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 文本操作之sed相关的知识,希望对你有一定的参考价值。

sed强大的文本处理工具,其工作流程大概如下
技术分享图片

常用选项说明

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。

操作命令:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法。

1、实验环境

[[email protected] test]# pwd
/root/test
[[email protected] test]# ls
fstab  yum.conf

[[email protected] test]# cat -n fstab
     1
     2  #
     3  # /etc/fstab
     4  # Created by anaconda on Sun Apr 22 06:26:44 2018
     5  #
     6  # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
     7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
     8  #
     9  UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
    10  UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
    11  UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

花样删除:

 #删除1到9行
[[email protected] test]# sed ‘1,9d‘ fstab
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#--------------------------------------------------------------------------------------------------
#删除第3行
[[email protected] test]# sed ‘3d‘ fstab

#
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#--------------------------------------------------------------------------------------------------
#删除从第3行开始 连续5行的数据
[[email protected] test]# sed ‘3,+5d‘ fstab

#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#--------------------------------------------------------------------------------------------------
#删除奇数行
[[email protected] test]# sed ‘1~2d‘ fstab
#
# Created by anaconda on Sun Apr 22 06:26:44 2018
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
#
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0

#--------------------------------------------------------------------------------------------------
#删除^UUID=7开始的行 到UUID=9第一次出现的行   如果UUID=9没有出现,则一直往下删
[[email protected] test]# sed ‘/^UUID=7/,/^UUID=9/d‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#

#--------------------------------------------------------------------------------------------------
#删除第5行开始的行 到UUID=9第一次出现的行   如果UUID=9没有出现,则一直往下删
[[email protected] test]# sed ‘5,/^UUID=999/d‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018

#--------------------------------------------------------------------------------------------------
#执行两次操作
[[email protected] test]# sed -e ‘1,3d‘ -e ‘4,6d‘ fstab
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#--------------------------------------------------------------------------------------------------
#执行多次操作
[[email protected] test]# sed    ‘1d;2d;3d‘  fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

print

 #删除第5行开始的行 到UUID=9第一次出现的行  打印一次,其余正常输出
[[email protected] test]# sed ‘5,/^UUID=999/p‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#--------------------------------------------------------------------------------------------------
#删除第5行开始的行 到UUID=9第一次出现的行  看图理解 打印的行先执行,然后所有的数据用静默模式处理  
[[email protected] test]# sed -n  ‘5,/^UUID=999/p‘ fstab
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

第一行后面插入

 [[email protected] test]# sed   ‘1a \newline‘ fstab

newline
#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

第三行插入

 [[email protected] test]# sed   ‘3i \newline‘ fstab
newline

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

第三行替换

 [[email protected] test]# sed   ‘3c \newline‘ fstab

#
newline
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

把第四行写入到w.txt文件中

 [[email protected] test]# sed   ‘4w /root/test/w.txt‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

[[email protected] test]# cat w.txt
# Created by anaconda on Sun Apr 22 06:26:44 2018

读取文件内容到第六行下面输出

 [[email protected] test]# sed   ‘6r /root/test/w.txt‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# Created by anaconda on Sun Apr 22 06:26:44 2018
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

为模式匹配到的行打印行号

 [[email protected] test]# sed   ‘6=‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
6
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

正则使用

 [[email protected] test]# sed ‘1,10s/UUID/uuid/‘ fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 22 06:26:44 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
uuid=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
uuid=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

高级用法:

逆序排序

[[email protected] test]# sed  ‘1!G;h;$!d‘  fstab
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
#
# Created by anaconda on Sun Apr 22 06:26:44 2018
# /etc/fstab
#

实现过程py分析

 mode_space = ‘‘
keep_space = ‘‘

with open(‘test2.txt‘,encoding=‘utf-8‘)  as f:

    i=0
    for line in f:
        if i == 0:
            mode_space = line
            keep_space = mode_space
        else:
            mode_space = line+keep_space
            keep_space = mode_space
        i += 1
    else:
        #最后一行读完删除
        print(keep_space)
        del keep_space

取出最后一行

[[email protected] test]# sed ‘$!d‘ fstab
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

取出文件后两行

[[email protected] test]# sed  ‘$!N;$!D‘ fstab
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

显示偶数行

[[email protected] test]# sed  -n  ‘n;p‘ fstab
#
# Created by anaconda on Sun Apr 22 06:26:44 2018
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
#
UUID=3d81b92c-abeb-41f5-8de0-b46d3ffbcf4c /boot                   xfs     defaults        0 0

显示奇数行

[[email protected] test]# sed  ‘n;d‘ fstab

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=7ceb028a-a8b8-467c-b6d4-36910c06c5ac /                       xfs     defaults        0 0
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

以上是关于Linux 文本操作之sed的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理之sed

Linux文本处理三剑客之sed

linux文本处理三剑客之sed

Linux高级文本处理之sed

玩转LINUX之sed命令详解

文本处理三剑客之sed