Linux文本处理之sed

Linux文本处理之sed

上一篇我介绍了文本处理grep,现在我来介绍一下文本处理三剑客的第二剑客——sed。

sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed 的具体用法,但是个人觉得没有必要去学习它的每个细节,那样没有特别大的实际意义。sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

1.sed用法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

2.参数说明(选项命令)

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。

  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。

  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息。
  • -i.bak 备份文件并原处编辑
  • -r 可以使用扩展正则

3.动作说明(编辑命令)

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

4.地址定界

a.关于定址:

默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数                   行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"

b. 数字定址:数字定址其实就是通过数字去指定具体要操作编辑的行,如下:

[[email protected](yuaning) ~]# cat abc.txt 
a
b
c
d
e
[[email protected](yuaning) ~]# sed -nr '4s/d/4/p' abc.txt (指定第4行的d替换成4,-n默认不输出,记得在正则表达式最后加上p)
4
[[email protected](yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[[email protected](yuaning) ~]# sed -n '2,4s/linux/hello/p' abc.txt 
2hello
3hello
4hello   (指定第2行到第4行的字符Linux替换为hello)
[[email protected](yuaning) ~]# sed -n '1,+2s/linux/hello/p' abc.txt 
1hello
2hello
3hello   (指定第1到1+2行的字符Linux替换为hello)
[[email protected](yuaning) ~]# sed -n '$s/linux/hello/p' abc.txt 
5hello   ($表示最后一行)
[[email protected](yuaning) ~]# sed -n '2!s/linux/hello/p' abc.txt 
1hello
3hello
4hello
5hello    (!表示除了指定行以外的行,记得不要写反了)

c.正则表达式定址:正则定址使用目的和数字定址完全一样,使用方式上有所不同,是通过正则表达式的匹配来确定需要处理编辑哪些行,其它      行就不需要额外处理,如下:

[[email protected](yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[[email protected](yuaning) ~]# sed '/3linux/d' abc.txt 
1linux
2linux
4linux
5linux     (表示只把指定行删除,其他行不变)
[[email protected](yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[[email protected](yuaning) ~]# sed '/^[[:digit:]].*/d' abc.txt 

[[email protected](yuaning) ~]# sed '/^[[:digit:]][[:lower:]]\+/d' abc.txt 

666   (用正则表达式选择匹配的行删除)

d.数字和正则混合使用:正则表达式和数字组合更为灵活

[[email protected](yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[[email protected](yuaning) ~]# sed '4,/^$/d' abc.txt 
1linux
2linux
3linux
666       (表示删除从第4行到空白行)

e.高级使用:读取一个数据指令从第一个挨个执行到最后一个指令,指令用;隔开,然后进行下一个数据的循环,直到数据全部执行一次

模式空间和保持空间:模式空间初始化为空,处理完一行后会自动输出到屏幕并清除模式空间;保持空间初始化为一个空行,也就是默

认带一个\n,处理完后不会自动清除。模式空间和保持空间,从程序的角度去看,其实就是sed在工作的时候占用了一些内存空间和地址,

sed工作完毕就会把内存释放并归还给操作系统。

g:将保持空间的内容拷贝到模式空间中,原模式空间将被清零。

G:将保持空间的内容追加到模式空间\n之后。

h:将模式空间的内容拷贝到保持空间中,原保持空间将被清零。

H:将模式空间的内容追加到保持空间\n之后。

d:删除模式空间中的所有行,并读入下一行。

D:删除模式空间的第一行,不读入下一行。

x:交换内容

n:读取匹配到的下一行覆盖至模式空间。

N:读取匹配到下一行追加到模式空间后。

[[email protected](yuaning) ~]# seq 1 10 |sed -n 'n;p'   (打印偶数行)
2
4
6
8
10   (把读取到1放到模式空间,然后n指令紧接着把下一行的2覆盖1,然后p指令打印)
[[email protected](yuaning) ~]# seq 1 5 |sed '1!G;h;$!d'    (倒序输出)
5
4
3
2
1
[[email protected](yuaning) ~]# seq 1 5 |sed -n '1!G;h;$p'
5
4
3
2
1
[[email protected](yuaning) ~]# seq 1 5 |sed 'N;D'   (输出最后一行)
5
[[email protected](yuaning) ~]# seq 1 5 |sed '$!d'
5
[[email protected](yuaning) ~]# seq 1 5 |sed '$!N;$!D'  (输出最后两行)
4
5
[[email protected](yuaning) ~]# seq 1 3 |sed 'G'   (每行后面加一个空行)
1

2

3
[[email protected](yuaning) ~]# seq 1 10 |sed 'n;d'   (输出奇数行)
1
3
5
7
9

sed的用法很多,更多的需要在以后的工作中慢慢摸索,这里只是一个简单的记录。

原文地址:http://blog.51cto.com/13805636/2151558

时间: 2024-11-06 17:53:06

Linux文本处理之sed的相关文章

Linux文本处理工具——Sed

sed:数据流编辑器: awk:报告文本的生成器 sed 基本用法:(Stream EDitor) Stream 流 EDitor 编辑器 行编辑器 全屏编辑器:vi/vimsed:内存空间(模式空间)默认不编辑源文件,仅对模式空间中的数据作处理,处理结束后,将模式空间打印到屏幕 sed [options] 'AddressCommannd' file ... -n: 静默模式,不再默认显示模式空间中的内容 -i: 直接修改源文件 -e SCRIPT -e SCRIPT:可以同时执行多个脚本 -

linux文本管理工具sed

sed [OPTION]...  'script'  [input-file] ... script: 地址定界编辑命令 常用选项: -n:不输出模式空间中的内容至屏幕: -e script, --expression=script:多点编辑: -f  /PATH/TO/SED_SCRIPT_FILE 每行一个编辑命令: -r, --regexp-extended:支持使用扩展正则表达式: -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 : ~]# sed  -e

Linux文本三剑客之sed

sed: Stream EDitor, 行编辑器 用法: sed [option]... 'script' inputfile... script: '地址命令' 常用选项: -n:不输出模式中的内容至屏幕 -e: 多点编辑 -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本 -r: 支持使用扩展正则表达式 -i: 原处编辑 地址定界: (1) 不给地址:对全文进行处理 (2) 单地址: #: 指定的行 /pattern/:被此处模式所能够匹配到的每一行 (3) 地址范围

Linux文本处理工具sed

sed工作原理:sed从文件中读取出来一行,并不会直接进行编辑处理而是会放在自己的模式空间内进行处理,处理的结果将会送到标准输出,默认情况下sed可以对每行文本进行处理,也可以让sed处理符合条件的行,我们可以利用正则表达式做文本过滤,模式空间有两种输出结果,一种是可以匹配到的,会根据编辑要求进行处理,例如删除,过滤字符串.另外一种则是匹配失败的,会直接进行标准输出. sed常用选项: -n:不输出模式空间中的内容至屏幕:不会把模式空间内的信息输出出来. -e:多点编辑:可以同时编辑多个匹配条件

Linux文本处理命令“sed”简解

文本处理编辑命令sed 命令格式: sed [选项] '(截取的行)[动作]' 文件名 选项:-n:只把经过sed处理的行输出 -e:允许输入多条动作 -i:sed修改的结果写入文件 截取行:(1)直接输入行号 (2)/正则表达式/ (3)x,y 从x到y行,也可以用正则取代 (4)x,y! 取反 (5)x~y 从x行开始,步进y行 (6)$ 文档末 动作:p  打印   eg: sed -n '(行)p' student.txt a  行后增加新的一行,i  行前增加新的一行 sed  '1,

Linux文本处理工具sed练习题

1.使用sed命令打印出ifconfig ens33的ip地址 解:(1)ifconfig ens33 | sed -n '2p' | sed 's/.*inet //' | sed 's/netmask.*//'    (2)ifconfig ens33 | sed -n '2p' | sed -r 's/.*inet (.*)netmask.*/\1/'    (3)ifconfig ens33 | sed -r -n '2s/.*inet (.*)netmask.*/\1/p' 2.使用s

linux文本处理三剑客——sed

sed: 1,流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下行,这样不断重复,直到文件末尾. 2,sed默认不编辑原文件内容,仅对模式空间中的数据做处理,除非你使用重定向存储输出. sed [OPTION] 'address command' [script] file... OPTION -n:静默模式:不显示模式空间中的行 -e

linux文本处理sed、软件包管理、磁盘存储、文件系统和挂载

Linux文本处理工具sed.软件包管理.磁盘存储及文件系统 文本处理工具sed巧妙用法 1.通过sed获取文件路径的基名和目录名 思路:采用正则表达式将文本字符串分组,取对应的分组后向引用即可. 获取基名 [[email protected] ~]#echo /etc/sysconfig/network-scripts/ |sed -r '[email protected](^/.*/)([^/]+)/[email protected]\[email protected]' network-s

linux文本三剑客匹配网卡IP地址大PK(CentOS 7系统)

    运维工程师在做配置的过程中很多时候都需要去获取目标服务器网卡上的IP地址,那究竟用什么方式获取更便捷了,博主今天就带大家使用linux文本三剑客分别获取一下网卡的IP地址,最后我们再来对比一下. 实验环境: 系统:CentOS 7.2 网卡张数:双网卡 linux文本三剑客之grep 获取ifconfig输出中的IP地址 ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>.(\