linux入门之文本处理工具sed粗略使用(1)

 文本处理工具常见有以下三种:

 grep,sed(流编辑器),awk

 

一、sed大概简介

    sed类似于grep,是一种在线编辑器、行编辑器,但是模式只处理不会更改数据,逐行处理内容,处理数据时会把数据流存在一个缓存区中,也就是buffer,每个缓存区都有一定的模式空间(pattern space),并且每个模式空间都表示了一个唯一的临时内存地址,在处理结束后会把模式空间中的内容使用标准输出,然后继续处理符合模式的下一行,然后再次输出。如果,让我来说这些过程类似于什么,那我会想到:在北京北五环这样恐怖的地方,偶尔买个东西想想都可怕,因为路太远,商场太大,一般每次去都要一次买很多东西,那么每次手都拿个东西会发现不够用,那么我就需要一个购物车,拿一个东西然后就放到车里,把一个东西放入购物车的这个步骤,就是数据逐行处理的工程呀,买完了也就相当于处理结束了

 

1、常用功能简介

一般对于文本匹配的数据进行替换、删除、新增,而且可以多部方式一起使用,还可以通过特定格式的文本来预先执行要执行的命令

 

2、特性总结

1、并不直接处理文本本身,先将文本中的是数据放到内存,然后在内存中读取

2、模式空间( sed 的内存地址空间唯一 )

3、默认不编辑原文件,仅对模式空间中的数据做处理: 结束后将模式空间的内容打印到屏幕

 

提示: sed  Stream Editor (流编辑器)

  sed行编辑器读取数据流时逐行读取放入内存,并不能直接对全屏进行编辑。

    全屏编辑器常用的有vi vim nano

二、sed基本用法

1、命令格式

sed [option] 'AddressCommand' file ....

对一个或多个文件地址符合条件的行来使用指定的命令

概括: 格式简述就是地址+命令配合使用

 

2、sed 的询址方式:

1、单行:  [line-address] command; 寻找匹配匹配line-address行地址并处理

2、多行:  [line-address1,line-address2] command; 寻找匹配行之间的内容

3、行集合:[regexp] command; 寻找符合正则条件的匹配行

4、嵌套寻址:  使用多个寻址条件联合起来使用,后面的方式从前面的方式打印结果去匹配,也可以用-e选项来实现格式比较特殊

  1,2{ /^L/d;  }

              {4,$s/^L/##/g; 1,2d; }

3、sed 的option常用项

option  常用选项说明:

sed [option] 'AddressCommand' file1 ...

-n : 静默模式,不再默认显示模式空间中的内容,一般和p命令配合使用来输出地址匹配的指定行

-i : 直接修要操作的改源文件

-e : -e SCRIPT -e SCRIPT 可以执行多个脚步,后面的 -e 会调用 前面的 -e 打印信息进行处理打印

  -f : /PATH/TO/SED+SCRIPT/  从指定文件中读取数据

  sed -f /path/to/stript file

  注意: /path/to/stript 表示写好sed模式和命令语句的文本文件路径

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

 

4、Address  寻址方式一般格式:

1StarLine,EndLine

比如 1,100  (1~100)

$: 表示最后一行

2/RegExp/  (使用正则表达式指定格式)

/^root/   root开头的行

3/pattern1/,/pattern2/

第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束

4LineNumber

指定的行

5StarLine+N

StraLine开始,向后的N

5、Address  寻址方式一般格式:

Command 常用操作命令说明

d: 删除符合条件的行  

p: 显示符合条件的行,一般和 -n 选项联合使用

a\ [string]: 在指定的行后面追加新行,内容为 a \ 后面的 string

 例如: '/^root/a \string'

i\ [string]:  在指定的行前面插入新行,内容为 i \ 后面的 string

     例如:'1,3i \string'  (13行每行前面插入新字符会新行)

     注意string之间可以加 \n 换行符来实现添加多行

r [filepath] :  从指定路径文件内容添加至符合条件的行处

w [filepath] : 将地址指定范围的内容另存至指定的文件中如果文件中有内容会被覆    类似于 echo ssss > file 标准输出重定向

s/pattern/string/ : 查找并替换,默认只替换每行第一次被模式匹配的字符串

            加修饰符

g : 全局替换

i : 忽略字符大小写

注意:替换不仅使用/符号(s/keystring/replace/)同时也可以使用以下代替,比如不想转义/符,直接使用/原有的意思,还可以使用以下的符号:

s###, s@@@ s%%% 等等

\(\), \1, \2  支持分组后项引用,可以用 & 表示模式中的字符

    例子:sed 's#l..e#&r#g'  ---- l开头e结尾的字符后加r

 

 

模式和行匹配格式1,3d   $d       这里使用指定行数删除指定的行

                   /^roor/a \string   这里按照模式匹配删除指定的行集合

 

 

6、实例详细解析info

 

1、创建三个实验个文件

第一个文件:vim sedtest.txt  文件内容如下

My birthday is February 13, 1995 3.134

My class is class 1, class twentieth.

Today is October 2010.

my love is love

my like is like

Some is ki 1.2 34.5

tree NE ER 1.3 35.6

第二个文件:vim sedtest3.txt  文件内容如下

wo yao insert

*******************

wo yao insert

******************

xi  xi  xi

 

第三个文件:vim sedtest2.txt  文件内容如下

[root@localhost test]# cat sedtest2.txt

this is test line.

 

 

this is test line.

this is test line.

 

this is test line.

this is test line.

 

 

this is test line.

 

 

this is test line.

 

2、命令执行说明

2.1、删除 d delete

 

行模式: 匹配指定行

 

单行

sed '1d' sedtest.txt       删除第一行

sed '$d' sedtest.txt       删除最后一行

 

多行

sed '3,4d' sedtest.txt     删除第3~4

sed '2,$d' sedtest.txt       删除第2~最后一行

sed '2,$-1d' sedtest.txt     删除出第2~倒数第2

注意:这里的$-1可能bash会有所不支持,执行可能会报错,原因目前不明

 

行集合

sed '/^m/d'           删除以小写m开头的行

 

2.2、追加 a append  

sed  '1,2a \new string \nHello world' sedtest.txt     

在第一行到第二行后面追加2行数据

sed  '/^m/a \ 1new string \n2 new string' sedtest. txt  

在以m开头的行后面追加2

 

2.3、插入 i insert

sed '1,2i \new string \nHello world' sedtest.txt   

在第一行到第二前面插入2行数据

sed  '/^M.*[0-9]$/a \ 1new string \n2 new string' sedtest. txt

在以M开头数值结尾的行集合前插入2行数据

 

2.4、打印 p print

sed '/my/p' sedteset.txt  

打印所有并重复打印含有my字符的行集合

注意:默认情况下sed会把文本全部打印,然后对符合条件的行进行命令,这里会再次打印,所以有my字符的行都会被打印2

sed -n '/my/p' sedtest.txt

只打印含有my字符的集合,使用-n 静默模式,禁用掉默认输出功能

 

 

2.5、行替换 c replace

sed '/^m/c \Replace Create NewLine' sedtest.txt  

把以m开头的行集合替换为c \ 后面的字符串

sed '1,$/c \Replace Create NewLIne' sedtest.txt   

把所有内容替换为指定的字符串

 

多行调用 N

sed -e '/^$/N /^\n/d' sedtest2.txt   

删除空白行中加回车换行符的空白行

sed -e '/^$/N /^\n/D' sedtest2.txt

 

2.6、读取文件并添加内容 r read

sed '/^m/r sedtest3.txt'  sedtest.txt

sedtest3.txt中读取文件追加到以m开头的行集和后后面

sed '1,2/r /etc/issue' /etc/inittab   

在第一行和第二行的后面加入/etc/issue的全部内容

 

2.7、把匹配的行写入到指定文件 w write

sed '/^m/w sedteset4.txt' sedtest.txt

读取以m开头的行集合写入到sedteset4.txt文件中

sed '1,2w sedtest4.txt' sedtest.txt | cat  sedtest.txt  

1~2行写入到sedtest.txt

注意: 文件不存在将会被创建,文件存在时原有内容会被当前内容覆盖,相当于 > 标准输出重定向

 

2.8n next 从内存地址中只截掉模式匹配的第一次行,并保留其他行

sed -e '/^m/n' -e 's/m/#/' sedtest.txt  

找到所有以m开头的行,把除了第一次匹配的行(第一次下面剩下的行集合)m替换为#

解析:截掉匹配结果一次后的当前行,把后面再次匹配的行保留到内存空间地址中

 

2.9y 变换

提示:支持相同类型,比如字符和字符,数值和数值,不支持正则表达式

sed '4,5y/my/MY/' sedtest.txt   4~5行中的my替换为MY大写

sed '6,$y/1/0'  sedtest.txt   把第6行到最后一行的 1 替换为 0

注意:替换的字符或者数值数量必须一样,行中所有符合的字符或数字都会被替换,行中所有字符全局替换

 

2.10s 替换

提示:默认为全文查找替换每行的第一个匹配字符 同等于 1,$

sed 's/love/LOVE/' sedtest.txt    

此行有2love却只有第一个被替换

sed 's/love/LOVE/g' sedtest.txt   

替换符合行中所有的字符 + g

sed 's/my/******/gi' sedtest.txt  

忽略大小写字母并替替换所有 i 表示忽略大小写

sed '4,5s/l..e/&r/g' sedtest.txt  

将第45行中的含有字符l和之间有有任意两个字符的字符后面加r

注意:& 表示前面匹配的所有字符

sed '4,5s/\(l\)..e/\1oooooo/g'    

\1表示后项引用第一个分组

 

 

注意:对以上文件进行文本操作实验,以下操作都是对文本行匹配,一般情况下不会修改源文件,如果以后对系统配置有了解需要快速修改文件关键部分,可以是用-i选项修改源文件

例如:

sed -i 's/^\(PROBOOT=\)dhcp/\1static/g'   /etc/sysconfig/network-scripts/ifcfg-eth0

eth0网卡配置文件中的ip自动获取修改为static静态ip

 

实战之一:

1、删除/etc/grub.conf文件中行首的空白符;

sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf

2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5

sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab

3、删除/etc/inittab文件中的空白行;

sed '/^$/d' /etc/inittab

4、删除/etc/inittab文件中开头的#;

sed 's@^#@@g' /etc/inittab

5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

sed -r 's@^#[[:space:]]+@@g' /etc/inittab

6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#

sed -r 's@^[[:space:]]+#@@g' /etc/inittab

7、取出一个文件路径的目录名称;

echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'


作者声明:本人初学,如果有不足或者需要改进的地方希望提出请提出