文本处理三剑客之sed基础用法


sed简介:

sed是Stream EDitor的缩写,也就是流编辑器的意思,准确的说sed是一个交互式的面向字符流的编辑器,这是因为输入的数据通过sed程序并直接输出到标准输出(可以是显示器或者文件)。

sed功能:

每次从文件中读取一行通过解释脚本指定的执行动作来处理这一行(一行要历经所有处理动作),然后开始下一行,直到结束。执行动作可以是多个(用;隔开每个动作),解释脚本也可以是多个,可以实现删除,插入,查找替换等等强大功能,但是一般不编辑源文件,也就是说源文件内容不发生变化。

sed原理:

sed每读取一行就会放到一个叫“模式空间”的空间中处理,然后默认输出到标准输出,注意

sed是行编辑器,每次只处理一行,处理完了一行才会继续处理下一行。当一行能被模式空间里的模式匹配就会执行你所指定的执行动作,当然默认也是会输出到标准输出,当这一行没被模式空间里的模式匹配到时候就直接输出到标准输出,正因为是通过模式空间来处理,所以不会直接编辑源文件。

sed用法:

sed [option] ‘script‘ input(处理option其他都是必须的)

option:

-n:将模式空间中默认输出到标准输出的强行不输出

-e:实现多点操作,也就是可以一次指定多个script

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

-i:相当于直接编辑源文件(用之前要慎重)

script:包括地址定界和处理动作且两者之间没有空格。

地址定界:

空地址:只有处理动作而没有任何的地址就是代表全文件

单地址:

#:表示只处理文件的#这一行

/pattern/:表示处理pattern模式所匹配到的每一行

地址范围:

#1,#2:表示处理#1和#2之间所有行,事实上sed在匹配到第一个地址的时候就开启了处理模式(编辑模式会好理解些),然后一直编辑包括这个地址的行后面的所有行,直到匹配到第二个地址的时候就关闭编辑模式。

#,/pattern/:处理文件的第#行开始的后面所有行直到匹配到pattern这个模式的时候结束编辑模式。

/pattern1/,/pattern2/:处理文件从匹配到的pattern1的行开始的后面所有行直到匹配到pattern2为止

地址步进:

#1~#2:表示处理从#1开始的以#2为步进的后面的所有行,例如1~2,处理所有奇数行,2~2表示处理所有偶数行。

编辑命令:

d:删除模式空间中匹配到的行(就是删除匹配到地址定界的行)

[[email protected] ~]# sed ‘1,10d‘ /etc/fstab
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0

p:将模式空间中的匹配到的行的内容打印出来

[[email protected] ~]# sed ‘10p‘ /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Mar 12 16:15:59 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=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0
[[email protected] ~]#

这里需要说明一下,前面已经说了,无论模式空间中的内容是否被匹配都会默认输出到标准输出上的,也就是第10行被匹配到了,默认就会输出到标准输出,而p是将匹配到的模式空间中的行打印到标准输出,那么第10行就会打印两次。而d不一样,他删除的就是模式空间里的内容,所有模式空间中已经没有被匹配到的行了,所以无法输出。

因为p的这种特性,所以一般p会和选项-n一起使用,-n是不输出模式空间里的任何默认输出到标准输出的行,而p刚好打印出模式空间中匹配到的行并不是默认输出的行。

[[email protected] ~]# sed -n ‘10p‘ /etc/fstab
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
[[email protected] ~]#

看见没,所以一定要注意默认输出和主动打印

a:地址定界中匹配到的行下添加一行或者多行命令

[[email protected] ~]# sed  ‘10a \a new line‘ /etc/fstab
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
a new line
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
 这里我省略了上下的内容

这里是添加一行,添加多行的时候只需要使用换行符

[[email protected] ~]# sed  ‘10a \a new line \n another line‘ /etc/fstab
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
a new line 
 another lineU 
UID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0

i:与a相反,在地址定界匹配到的行上面添加一行或者多行

c:修改匹配到的地址定界的行

[[email protected] ~]# sed ‘10c \new line‘ /etc/fstab
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
new line
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
[[email protected] ~]# sed ‘10c \new line\nanother new line‘ /etc/fstab
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
new line
another new line
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
当然也可以在修改的行后面添加新的行

w 路径:将模式空间中匹配到的行输出到文件中,但是显示器上还是会显示所有内容,除非用-n选项

[[email protected] ~]# sed -n ‘10w /tmp/atest‘ /etc/fstab
[[email protected] ~]# cat /tmp/atest 
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0

[[email protected] ~]# sed ‘10w /tmp/atest‘ /etc/fstab

[[email protected] ~]# sed ‘10w /tmp/atest2‘ /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Mar 12 16:15:59 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=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0
[[email protected] ~]#  
[[email protected] ~]# cat /tmp/atest2
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
[[email protected] ~]#

r 文件路径:读取指定文件到地址定界匹配到的行的下面

[[email protected] ~]# echo "this is a test">/tmp/atest3
[[email protected] ~]# sed ‘1~2r /tmp/atest3‘ /etc/fstab
this is a test
#
# /etc/fstab
this is a test
# Created by anaconda on Sat Mar 12 16:15:59 2016
#
this is a test
# 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
this is a test
#
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
this is a test
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
this is a test
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0
[[email protected] ~]#

=:在模式空间中匹配到的行的上面添加匹配到的行的行号

UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
10
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0

!执行动作:对模式空间中匹配到的行不执行此操作。没匹配的行执行此承操作

[[email protected] ~]# sed ‘10!=‘ /etc/fstab
1
2
#
3
# /etc/fstab
4
# Created by anaconda on Sat Mar 12 16:15:59 2016
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=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
UUID=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
11
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
12
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0
[[email protected] ~]#

s:查找模式空间中匹配到的行的指定内容并替换为其他指定内容

s///或者[email protected]@@或者s###默认只替换匹配到的行的第一个匹配到的内容

-g:全局替换

-p:显示替换成功的行

-w 文件路径:将替换成功的行写入指定文件中

[[email protected] ~]# sed ‘10s/^UUID/it work/‘ /etc/fstab
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
it work=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0

需要注意一下,这个替换不是只替换//中的内容,除非指定整行

[[email protected] ~]# sed ‘10s/^UUID.*/it work/‘ /etc/fstab 
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
it work
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0

再来看看p,和前面的一样,因为默认会把模式空间的内容输出到标准输出,所以p就会把替换成功的行打印出来

[[email protected] ~]# sed ‘10s/UUID/it work/p‘ /etc/fstab 
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
it work=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
it work=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0

再来看看w也是一样,把替换成功的行输出一份到指定文件

[[email protected] ~]# sed ‘10s/UUID/it work/w /tmp/atest4‘ /etc/fstab
UUID=2816cce5-45cb-4632-b4ef-d5360260af6c /                       xfs     defaults        0 0
it work=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
UUID=1ae437de-485a-4f2e-a1b1-4e3327ba6c8a /var                    xfs     defaults        0 0
UUID=7efc21b5-5de1-47c1-8f92-a5b6a0f7f6a0 swap                    swap    defaults        0 0 
[[email protected] ~]# cat /tmp/atest4
it work=d8644fab-df0d-436b-9845-6a2f79ad6f99 /boot                   xfs     defaults        0 0
时间: 2024-10-18 16:15:53

文本处理三剑客之sed基础用法的相关文章

文本处理三剑客之-sed基础用法

文本处理三剑客: grep,egrep,fgrep:文本过滤器 sed:stream EDitor:流编辑器,行 awk:文本格式化工具,报告生成器 sed [OPTION]...'script' [input-file]      script:地址定界编辑命令                [option]           -n:不输出模式空间中的内容至屏幕           -e:多点编辑           -f /path/to/sed_script_file:         

文本处理三剑客之sed基本用法

sed:streameditor,意为流编辑器,是类Unix操作系统常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出:sed通常用来匹配一个或多个正则表达式的文本进行处理. sed工作原理: sed维护了两个数据的缓冲空间:模式空间(patternspace)和保留空间(hold space),初始环境都为空: 1.当sed命令对一个文本文件进行处理,逐行读取文本文件进行地址匹配,将匹配到的行放在模式空间中: 2.sed的编辑命令对模式空间中的内容进行编

文本处理三剑客之-sed高级用法

高级编辑命令:      h:把模式空间中的内容覆盖至保持空间中      H:把模式空间中的内容追加至保持空间中      h H  Copy/append pattern space to hold space           g:把保持空间中的内容覆盖至模式空间中      G:把保持空间中的内容追加至模式空间中      g G  Copy/append hold space to pattern space.           x:把模式空间中的内容与保持空间中的内容互换    

文本处理三剑客之sed

文本处理三剑客之sed sed概述 sed使用示例 sed的高级应用 sed概述 sed, 作为文本三剑客之一,其定位就是一个编辑器, 而且sed是一个流式编辑器(stream editor),其主要功能是过滤和转换文本. sed - stream editor for filtering and transforming text 作为一个强大的文本处理功能,sed 自然能够配合正则表达式,另外,所谓流编辑器,sed 是逐行地读取文本,在文本行中应用指定的命令,且默认输出到stdout; se

文本处理三剑客之sed(流编辑器)

文本处理三剑客之sed(流编辑器) - 行编辑器 把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件. - 用法 sed [option]... 'script' inputfile... ###### - 常用选项 -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容加-n 可以只显示需要打印的行 [root@localhost home]# sed -n '2,3p' /etc/passwd bin:x:

文本工具三剑客:sed

文本工具三剑客:sedsde是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓存区,称为 模式空间    用法:    sed [选项] [加自己的语言] [要处理的文件]    选项:        -n  不输出模式中的内容至屏幕            # sed -n "10p" f2 只打印出第10行匹配到的行 其他不显示            10  UUID=07a475f4-3d7a-4b27-9ec9-500bc8a19c4d /boot      

Linux文本处理“三剑客”之sed

sed(Stream Editor)是一个行编辑工具.下面我们介绍 sed 的实现原理和基本使用方法. 一.sed 的处理文本的流程 基本处理流程如下: 处理流程是:每次读入文本文件的一行到内存中的模式空间中,在模式空间中处理后将处理的结果输出,默认会打印到屏幕上.因此,默认情况下,不会改变原文件的内容. 二.sed 命令的使用 基本语法:sed [options]... '地址定位 编辑命令' FILE... 地址定位的方法: 1.行定位: start_line[,end_line] 2.模式

Linux 篇 | 文本处理三剑客之SED

文本处理三剑客之SED sed不仅可以像grep过滤文件,查找想要的内容,还可以更改文件,这是grep做不到的. 一.sed介绍 Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.然后读入下行,执行下一个循环.如果没有使诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间.这

8.9_Linux文本处理三剑客之sed和文本编辑利器vim的使用

本文处理三剑客之sed的使用   什么是sed? Stream EDitor(简称sed), 行编辑器,一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上. sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多