Sed文本处理工具

Posted

tags:

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

本章思维导图:

技术分享图片

一、Sed概述
1、Sed定义:
 Sed(Stream EDitor)行编辑器,Sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲 区中,称为“模式空间”,接着用sed命令处理“模式空间”中的内容,处理完成后,默认情况下会把“模式空间”的内容 送往标准输出(这时如果“模式空间”中内容的最后一行没有换行符,会在输出的时候自动添加一个换行符 )。然后读取 下行,执行下一个循环(如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间), 这样不断重复相同的操作,直到文件末尾;文件的内容并没有改变,除非你使用重定向存储输出。
2、功能:
 使用sed可以实现:数据的替换、删除、新增等,这里的数据可以是一些关键字,也可以是一些特定的行。
3、模式空间和保留空间:
4、grep、vim与sed相比的区别:
 grep:grep是根据给定的条件来检索关键字,而sed是搜索、匹配、处理文本的工具
 vim:vim是一种交互式的文本编辑工具,而sed是一种非交互式的文本编辑器,通过给定的条件自动的逐行去处理文件

二、命令的模式:

1、编辑命令模式:

1)语法:sed [options] 'command' file(s)

2)command部分的用法:

(1)语法:[地址1] [地址2] [函数] [参数]

 关键点:

command部分在编辑命令的模式下必须用单引号保护起来

一个或者两个地址是可以省略的

可以用任何目的空白或者Tab地址和函数分开

函数必须出现

依据给出的是哪个函数,标志可能是是必需的或者可选的(?)

引用shell变量时要使用双引号,而不是单引号

(2)地址定界:

数字:

#:#表示数字,指定第#行

例:sed '1d' test3.txt

表示删除test3.txt文件中的第1行

#1,#2:指定从第#1行到第#2行,以逗号分隔

例:sed '1,3d' test3.txt

表示删除test3,txt文件中的1-3行

#~i:从第#行开始,步长为i,直到结束

例:1~2:所有的奇数行

2~2:所有的偶数

#,+n:从第#行开始,一直到向下的n行后结束

正则表达式:

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

例1:sed '/Barry/d' test3.txt

删除test3.txt文件中包含“Barry”的行

例2:sed '/^Susan/d' test3.txt

删除test3文件中以“Susan”开头的行

/pattern1/,/pattern2/:从模式1匹配到的行开始一直到模式2匹配到的行结束,以逗号分隔

例:sed '/western/,/southeast/d'

删除包含“western的行和包含“southeast”的行之间的所有行(包含“western的行和含“southeast”的行这两行也删除)

组合使用

#,/pattern/:从第#行开始到能被此模式能匹配到的行结束

/pattern/,#:从能被此模式能匹配到的行开始到第#行结束

  例:sed '1,/western/d' test3.txt

  删除第一行到包含“western”的行之间的所有行

特殊用法:

$:用在地址定界中表示文件的最后一行

例:sed '1,$d' test3.txt

表示删除test3.txt文件中1行到最后一行之间的所有行

!:表示取反

例:sed '1!d' test3.txt

表示删除test3.txt文件中除了第一行之外的所有行

(3)函数用法

标准用法:

插入、修改、删除(标准用法)

a[\]:在当前被匹配到的行的下面加入一行,支持\n实现多行追加

例1:sed '/Barry/a\hello,world' test3.txt

在当前被匹配到的行的下面加入一行“hello,world”

例2sed '/Barry/a\hello\nworld' test3.txt

在当前被匹配到的行的下面分别加入两行,hello和world

c[\]:用新文本替换当前匹配行的文本内容,支持\n实现多行追加

  例1:sed '/Barry/c\hello,world' test3.txt

  用“hello,world”替换当前匹配到的行

  例2:sed '/Barry/c\hello\nworld' test3.txt

  分别用hello和world两行替换当前的行

i[\]:在当前被匹配到的行的上面加入一行,支持\n实现多行追加

例1:d '/Barry/i\hello,world' test3.txt

在当前被匹配到的行的上面加入一行“hello,world”

例2:sed '/Barry/i\hello\nworld' test3.txt

在当前被匹配到的行的上面分别加入两行,hello和world

d:删除当前匹配到的行

例:sed '/Barry/d' test3.txt

删除包含“Barry”的行

查找和替换

s:用一个字符串替换另一个字符串

s函数的语法格式:[地址1],[地址2]s<模式><替换><标志>

<模式>、<替换>、<标志>之间可以用不是换行符的其他符号作为分隔符,默认用/

<模式>:匹配到的要进行替换的关键字或者行,支持正则和扩展正则

               如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

               如果是对单行进行完全匹配,一般会使用正则表达式匹配一整行

例1:基名:echo /etc/init.d/functions | sed -r '[email protected]*/([^/]+/?)@\[email protected]'

取/etc/init.d/functions路径的基名

例2:目录名:echo /etc/init.d/functions | sed -r '[email protected](/.*/)[^/]+/[email protected]\[email protected]'

取/etc/init.d/functions路径的目录名

<替代>:要用来替代原有内容的字符串

在<替代>中有特殊意义的字符:

&:调用<模式>中匹配到的字符串

\#:在<模式>中使用\(\)分组之后,在<替代>中调用分组中的第#个字符串

<标志>:对替换行为要执行的一些操作

g:全文进行替换,默认只对匹配到的行的第一个匹配字符串进行替换

p:如果替换成功,打印出替换成功的行

w:如果替换成功,将替换成功的行写入一个文件

保存和取回

h:把“模式空间”中的内容拷贝一份覆盖至“保留空间”

例:sed  '/Barry/h;$G' test3.txt 或者 sed -e '/Barry/h' -e '$G'

把test3.txt文件中包含“Barry”的一行放置在文件的做后一行

H:把“模式空间”中的内容拷贝一份追加至“保留空间”

例:

g:把“保持空间”的内容拷贝一份并覆盖至”模式空间“

例:sed ‘g’ test1.txt

将test1.txt文件中的每行内容替换为空行

G:把“保持空间”的内容拷贝一份追加至“模式空间”

例:sed ‘G’ test1,txt

在test1.txt文件的每行后加一个空行

x:交换 “模式空间”和“保持空间”的内容

输入和输出(标准用法)

p:将匹配到的行打印出来

例:sed '/1111/p

将包含1111的行打印出来

r:从文件中读取输入行

例:sed  '/1111/r test3.txt' test1.txt 

从test.txt文件中匹配到包含1111的行就读入文件test3.txt中

w:将匹配到的行写入文件

例:sed '[email protected]@[email protected]g;wtest4' test1.txt 

将test1,txt文件中的1111替换为abcd之后将新内容写入新文件test4中 

=:为“模式空间”中的行打印行号

例:sed '[email protected]@[email protected];=' test1.txt

将test1文件中的1111替换为abcd后,将每一行的行号打印出来,行号是在每一行内容的上方 

控制流:

!:对所匹配到的行以外的所有行执行操作

例:sed '$!N;$!D' test1.txt

仅显示test1.txt文件的最后两行

{}:组合命令

一组命令作为一个模块而被应用

函数命令之间用分号分隔
组合可以嵌套
n:读取匹配到的行的下一行覆盖至模式空间,对这一行执行命令操作,而不是对匹配到的行执行操作。
例:sed 'n;p' test1.txt
输出test1.txt文件中的奇数行
高级用法
多行输入:
N:把匹配到的行的下一行追加至模式空间中,并与在模式空间中的第一行(即匹配到的行)共同创建一  个多行模式空间。
      第一行与第二行之间会生成一个换行符。
      sed将第一行与第二行共同看作一个有很多嵌入行的整行,并会对整行执行后面的操作。

       与n函数相比,n函数在于它输出模式空间内容,然后读取新行,并不建立多行模式空间。

例:sed 'N;[email protected]\[email protected]\[email protected]' test1.txt

将文件test1.txt文件中的的n和n+1行合并为一行,中间用Tab分隔(n为奇数行)。

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模 式空间重新启动循环。

      如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

例:sed 'N;D'  test.txt

仅显示test1.txt文件的最后一行

P:多行Print和print稍有不同。它输出多行模式空间的第一部分,直到第一个嵌入的换行符。

因此,当默认输出被抑制或脚本的控制流更改,以至于不能到达脚本底部的时候,需要使用打印命令P或者p。Print命令经常出现在Next和Delete命令之前。这三个命令能够建立一个输入输出循环,用来维护两行的模式空间,但是一次只输出一行, 然后返回到脚本的顶端将所有命令应用于模式空间的第二行。没这个循环,当执行到脚本的最后一个命令的时候,模式空间这两行将被输出。

多个函数综合使用

在多个函数多个函数连续使用的时候,函数之间需要用分号分隔的时候

3)options(命令行选项)

-n:不输出所有默认输出的行,只输出p函数或者在s函数后p标志所指定的行。

-e:允许多项编辑;多个命令均在模式空间的当前行上执行;命令的顺序会影响结果。

例:sed -e '1,3d' -e 's/western/southeast/'

-i:直接修改目标文件

例:sed .orig 's/Barry/Zhanghan' test3(?)

-f 下一个参数为sed脚本的脚本名,后面再跟上的参数才是要处理的文件名,sed脚本中是一行一个的sed编辑命令。  

例:sed -f Test1.sh test3.txt

-r:支持扩展正则

2、脚本模式:

1)语法:sed [options] -f scriptfile file(s)

2)sed script的规则:

脚本的实质是一个sed命令的清单。

在命令的末尾不能有任何空白或者文本。

如果在一行中有多个命令要用分号分隔。

不需要且不能用引号保护命令。

对以#开头的注释行不能进行跨行(?)。

脚本实例:

#!/bin/bash

/western/,/southeast/{

/^[[:space:]]*$/d

/Susan/{h;d}

}

/Ann/g

s/TB\(Savage\)/hahaha \1/

Test1,sh


以上是关于Sed文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章

Unix & Linux的文本处理工具 -- grep, sed & awk

sed文本处理工具

运维学习之sed文本处理工具

12文本处理工具sed

Sed文本处理工具

文本处理工具之---sed