简述linux中sed命令

sed命令:Stream EDitor 流编辑器

sed命令的工作流程:

sed会复制原文件中的一行或者多行,逐行进行操作。首先会将该行的内容放入到模式空间内,在模式空间内进行定界或者正则表达式匹配操作。

a.如果该行内容不符合正则表达式或定界,该内容则被判断为No,进行标准输出。

b.如果该行内容符合正则表达式或定界,该内容则被判断为Yes,进行编辑(包括标准输出)。

sed中模式空间和保持空间中的内容会进行会换,这种会换会使文件内容进行多次的筛选编辑,完成复杂的任务。

  一般情况下,sed是不会改变原文件的内容,如果需要,可以加-i参数改变原文件的内容。(改变文件内容前最好将原文件进行变名的备份)

sed [OPTION] ... ‘script‘ [input-file]...

script:地址定界编辑命令

常用选项:

-n:不输出模式空间中的内容至屏幕

-e:实现多点编辑

-f /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令

-r:支持使用扩展正则表达式

-i:直接编辑原文件

地址定界:

  1. 不给地址:对全文进行处理(空地址)
  2. 单地址:

    #:指定行

    /pattern/:被此模式所匹配到的每一行

  3. 地址范围:

    #,#:以第几行到第几行

    #,/pattern/:从指定的行开始到第1个pattern匹配到的行

    /par1/,/par2/:从第1个par匹配到的行到第2个par匹配到的行

    $:最后一行

  4. 步进地址:~

    1~2:所有奇数行

    2~2:所有偶数行

编辑命令:

    d:删除          例:sed ‘1,5d’ /etc/fstab  把fstab文件中的第1到第5行删除

    p:显示模式空间中的内容

    a \text :在行后面追加文本“text”,支持\n实现多行追加

    i \text :在行前面插入文本“text”,

例:

[[email protected] ~]# sed ‘3i \newline‘ /etc/fstab     #在第3行前面插入newline

#

newline

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

[[email protected] ~]# sed ‘3i \newline\nthis is anther line‘ /etc/fstab #支持\n

#

newline

this is anther line

# /etc/fstab

c \text :把匹配到的行替换为此处指定的文本"text"

例:

[[email protected] ~]# sed ‘/^UUID/c \#new line‘ /etc/fstab  #将所有UUID开头的行替换                                                            为new line

#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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

#

#new line

#new line

#new line

#new line

tmpfs                   /dev/shm                tmpfs   defaults        0 0

w /PATH/TO/SOMEFILE/:保存模式空间匹配到的行至指定的文件中

例:

[[email protected] ~]# sed ‘/^[^#]/w /tmp/fstab.new‘ /etc/fstab  #将非#开头的行保存                                                                  到/tmp/fstab.new中

[[email protected] ~]# cat /tmp/fstab.new

UUID=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

r /PATH/FROM/SOMEFILE   :读取指定文件的内容到当前文件被模式匹配到的行的行后面,实现文件合并

例:

[[email protected] ~]# sed ‘/UUID/r /etc/issue‘ /etc/fstab  #在所有UUID开头的行后面插                                                           入/etc/issue文件内容

#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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=d805bcfe-f510-4569-8bb8-3eed373118ea /                       ext4    defaults        1 1

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot                   ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir                ext4    defaults        1 2

CentOS release 6.8 (Final)

Kernel \r on an \m

UUID=95011402-df68-4950-8584-23826c8d3a79 swap                    swap    defaults        0 0

CentOS release 6.8 (Final)

Kernel \r on an \m

tmpfs                   /dev/shm                tmpfs   defaults        0 0

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

!  :条件取反   (地址定界!编辑命令)

例:

[[email protected] ~]# sed ‘/^#/!d‘ /etc/fstab   #删除fstab文件中不以#开头的行

#

# /etc/fstab

# Created by anaconda on Tue Jul 19 18:09:10 2016

#

# 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

#

[[email protected] ~]#

s///  :查找替换,其分隔符可自行制定,常用的有[email protected]@@,s###等。

替换标记:

    g  :全局替换

    w  :将替换成功的结果保存到指定的文件中

    p  :显示替换成功的行

例:

删除/boot/grwb/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符

sed ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg   #该/etc/grub2.cfg文件在linux7系统上

删除/etc/fstab文件中所有以#开头的行的行首的#及#后面的所有空白字符

[[email protected] ~]# sed ‘[email protected]^#[[:space:]]*@@‘ /etc/fstab

输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname

[[email protected] ~]# echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘

/var/log/

高级编辑命令:

h  :把模式空间中的内容覆盖至保持空间中

H  :把模式空间中的内容追加至保持空间尾部

g  :把保持空间中的内容覆盖至模式空间中

G  :把保持空间中的内容追加至模式空间尾部

x  :把模式空间中内容与保持空间中内容互换

n  :覆盖读取匹配到的行下一行至模式空间中(覆盖原行)

N  :追加读取匹配到的行下一行至模式空间中

d  :删除模式空间中的行

D  :删除多行模式空间中的所有行

例:

[[email protected] ~]# sed -n ‘n;p‘ /etc/fstab   #显示偶数行

#

# Created by anaconda on Fri Jul  8 21:17:42 2016

# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘

#

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

[[email protected] ~]# sed ‘$!d‘ /etc/fstab           #取出最后一行

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[[email protected] ~]# sed ‘$!N;$!D‘ /etc/fstab            #取出最后两行

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[[email protected] ~]# sed ‘/^$/d;G‘ /etc/fstab   #删除原有的所有空白行,而后为所有的                                                 非空白行后添加一个空白行

#

# /etc/fstab

# Created by anaconda on Fri Jul  8 21:17:42 2016

#

# 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

#

/dev/mapper/rhel-root   /                       xfs     defaults        0 0

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[[email protected] ~]# sed ‘n;d‘ /etc/fstab      #显示奇数行

# /etc/fstab

#

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/rhel-root   /                       xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

[[email protected] ~]# sed ‘G‘ /etc/fstab            #在每一行后面添加空白行

#

# /etc/fstab

# Created by anaconda on Fri Jul  8 21:17:42 2016

#

# 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

#

/dev/mapper/rhel-root   /                       xfs     defaults        0 0

UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot                   xfs     defaults        0 0

/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

时间: 2024-08-11 00:39:20

简述linux中sed命令的相关文章

关于linux中sed命令的简单用法

linux中sed的学习和使用 今天突然用到了sed这个命令,就即兴学习了一波突然感觉这个功能还是很强的.sed在#man sed下文档查看解释的是:用于过滤和转换文本的流编辑器.即如下图: 我自己用过这个命令之后感觉对于文档来说可以显示某个区间行,显示结果还可以在段前后添加内容删除,替换内容.但是最后才发现,怎么还能直接修改到文件里不仅仅是显示出来,文件内容直接被修改了. 下面就一一介绍这个有趣的命令,莫急莫急一个一个来. 首先找个文件(没用的文件且有内容,搞坏了系统文件可不好玩了)来当测试文

linux中sed命令的使用(绝对精华版)

sed命令是linux或者shell编程中常用的筛选.替换命令,如果能熟练使用sed则对经常使用的人来说在工作上是非常有帮助的 下面把sed主要的用法列出来(有错误的地方大家可以指正): p命令只打印第三行,没有-n会在第三行后多打印第三行:sed -n '3p' filename 只打印最后一行:sed -n '$p' filename 只打印10到20行(包括10和20行,若后面数字小于前面数字,则只打印前面数字的行):sed -n '10,20p' filename 打印包含My在行尾的行

linux中sed命令批量修改

sed命令下批量替换文件内容  格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` 文件名 -i 表示inplace edit,就地修改文件 -r 表示搜索子目录 -l 表示输出匹配的文件名s表示替换,d表示删除 示例:sed -i "s/shan/hua/g"  lishan.txt 把当前目录下lishan.txt里的shan都替换为hua sed的其他用法如下: 1.删除行首空格   sed 's/^[ ]*//g' f

linux中sed命令

sed基本用法: sed: Stream Editor  行编辑器,同vi编辑器不一样的是,vi编辑器是全屏编辑器. sed:模式空间 默认不编辑原文件,仅对模式空间中的数据做处理:而后,处理结束后,将模式空间打印至屏幕: sed [options] 'AddressCommand' file... -n:静默模式,不在默认显示模式空间中的内容 -i:直接修改原始文件 -e SCRIPT -e SCRIPT:可以同时执行多个脚本 -f  /PATH/TO/SED_SCRIPT sed -f /p

Linux中exec命令相关

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部 命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

Linux之sed命令常见用法

1. sed(stream editor),流编辑器 linux中,主要中sed命令实现对文件的增删改替换查 名称 sed - 用于过滤和转换文本的流编辑器 SYNOPSIS sed [选项]... {script-only-if-no-other-script} [文件]... 常用选项或命令 -i 正式执行操作修改内容 -n 取消默认输出 -e 允许多项编辑 -r 使用扩展正则表达式 = 在文件内容行前增加一行行号 s 查找并替换 g 全局范围 p 打印输出 '/ /p' 正则表达式匹配/

linux中find命令详解

http://blog.csdn.net/pipisorry/article/details/39831419 问题: linux中find命令查找时不包含某些目录 find 命令忽略某个或多个子目录的方法 在linux中用find 进行查找的时候,有时候需要忽略某些目录不查找,可以使用 -prune 参数来进行过滤,要忽略的路径参数必须紧跟着搜索的路径之后,否则该参数无法起作用. eg: [email protected]:/tmp1#find ./ -type f    #/tmp1目录下所

linux中ls命令详解

s 命令可以说是linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i 节点的修改时间,并以此排序.-d 将目录象文件一样显示,而不是显示其下的文件.-e 输出时间的全部信息,而不是输出简略信息.-f -U 对输出的文件不排序.-g 无用.-i 输出文件的 i 节点的索引信息.-k 以 k 字节的形式表示文件的大小.-l 列出文件的详细信息.-m 横向输出文件名

Linux中的命令 make -f 是什么意思

出处:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246091d21a8e07b770703a79b273b46e5540faab66d2369543de1cc8edb1183fa8f2d2d832735761892044f934fa0951d79866a875a98b86fe3ad863084afa2c4af5344bb55127bf0afd803570