文本处理三剑客-sed

1.文本处理三剑客-sed

#sed语法:
sed  [OPTION]...  {script-only-if-no-other-script}
       [input-file]...

sed理解:是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓存中,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完毕后吧缓冲区内容输出到屏幕接着处理下一行。这样不断重复到末尾。文件内容并没有改变。除非使用重定向输出才会改变内容。

 常用选项

-n 不输出模式空间到屏幕
-e 多点编辑,或
-f 从指定文件中读取编辑脚本
-r 使用扩展表达式
-i 原处编辑

2.sed处理地址范围定界:

1. 不给地址表示对全文处理


2. 单地址 指定行 ‘1‘ 第一行 ;

/ 关键字,可以是正则表达式或其他模糊匹配的符号/


3. 地址范围

'2,10'第二行到第十行 

’2,+10‘第二行再加10行 

/关键字/,/关键字/匹配第一个关键字到第二个关键字之间的内容 ;


4. 步进 

’1~2‘奇数行  

’2~2’偶数行

3.sed编辑命令

d 删除模式空间匹配到的行

[root@localhost testdir]# sed '1d' 1
     2	#
     3	# /etc/fstab
     4	# Created by anaconda on Thu Jul 28 17:47:00 2016


p 显示模式空间中的内容

[root@localhost ~]# sed '2p' /etc/issue
\S
Kernel \r on an \m
Kernel \r on an \m

显示两次的原因因为在模式空间输出一次然后p显示一次,加上-n是表示不输出模式空间到屏幕,如下输出


[root@localhost ~]# sed '2p' /etc/issue
\S
Kernel \r on an \m


a \添加内容 在匹配行后加入文本 \n多行插入

#实例解释
[root@localhost testdir]# sed -e  /UUID/a\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e /UUID/i\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  file1
     1	
     2	#
     3	# /etc/fstab
     4	# Created by anaconda on Thu Jul 28 17:47:00 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	/dev/mapper/centos-root /                       xfs     defaults        0 0
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
    10	UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot                   xfs     defaults        0 0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

i \添加内容  在匹配行后加入文本 \n多行插入

#实例解释
[root@localhost testdir]# sed '/^U/i\ZZZZZZZZZZZZZZZZZZZZZ\nNNNNNNNNNNNNNNNNNNNNNN\nssssssssssssssss' file3
#输出结果
ZZZZZZZZZZZZZZZZZZZZZ
NNNNNNNNNNNNNNNNNNNNNN
ssssssssssssssss
UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot

        

c \替换内容 替换单行或多行文本

#实例解释,也支持\n换行
[root@localhost testdir]# sed '/^U/c\relace' file3
#将以U打头的行替换成‘relace’

w /保存新文件路径

[root@localhost testdir]# sed '/^U/w /testdir/5' file3

r /保存文件路径

[root@localhost testdir]# sed '/^U/r /etc/issue' file3

= 在模式空间中打印行号

[root@localhost testdir]# sed '/^U/=' file6

!模式空间匹配到的取反

[root@localhost testdir]# sed '/^U/!=' file6

#ps:sed文件出是不修改原文件内容的,如果要修改可以使用选项-i

[root@localhost testdir]# sed -i '/^U/d' 3

修改之前可以将文件进行备份,在-i选项后面添加备份名可以在修改之前备份该文件

[root@localhost testdir]# sed -i.bak '/^U/d' 3

4.sed搜索替换

s/// 查找替换 支持使用分割符包括s@@@,s### 替换标记;
g:全局替换
p:显示替换成功的行
w 将替换成功的行保存至新文件
#实例操作解释
#1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
[root@localhost testdir]# sed '/^[[:space:]]\+/d' /etc/grub2.cfg 
#2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@localhost testdir]# sed 's/^#[[:space:]]\+//' /etc/fstab
#3、在/root/install.log每一行行首增加#号
[root@centos6 ~]# sed -n 's/^/#/p' /root/install.log
#4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@centos6 ~]# sed 's/^[^#]/#/' /etc/fstab
#5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
取基名
echo "/etc/fst/sd" | sed -r  's@(.*)/([^/]+/?)@\2@'
echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\1@' 
echo "/etc/fst/sd/" | sed  's@.*\<@@'
取目录
echo "/etc/fst/sd/" | sed -r  's#[^/]+/?$##'
#6、利用sed 取出ifconfig命令中本机的IPv4地址
[root@centos6 ~]# ifconfig|sed -n '2p'|sed 's/\<B.*//'|sed 's/^.*r:'//
#7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
[root@centos6 Packages]# ls |sed 's/.rpm$'//|sed 's/.*\.'//|sort|uniq -c

5.sed高级应用

首先要了解使用sed两个缓存空间,一个是模式空间,在前面已经说过了

另一个是保持空间

下面几个是sed的高级应用

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

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

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

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

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

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

d: 删除模式空间中的行

D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

#实例解释以后补充

原创文章,作者:snowbamboo,如若转载,请注明出处:http://www.178linux.com/33576

(0)
snowbamboosnowbamboo
上一篇 2016-08-12
下一篇 2016-08-12

相关推荐

  • Python函数式编程指南(三):迭代器

    这一篇我们将讨论迭代器。迭代器并不是函数式编程特有的东西,但它仍然是函数式编程的一个重要的组成部分,或者说是一个重要的工具。 转载请注明原作者和原文地址:) 3. 迭代器 3.1. 迭代器(Iterator)概述 迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。 迭代器不能回退,只能往前进行迭代。这并…

    Linux干货 2015-03-11
  • 马哥教育21期网络班—第二周课程+练习

    目录管理类命令: mkdir, rmdir, tree mkdir mkdir [options] /path/to/somewhere -p: 存在于不报错,且可自动创建所需的各目录; -v: 显示详细信息 -m MODE: 创建目录时直接指定权限; tree tree:  需要安装  yum -y install …

    Linux干货 2016-06-29
  • 马哥教育网络班21期+第一周课程练习

    一、计算机的组成及其功能 自上个世纪40年代开始截止到目前,我们所有的计算机包括手持的智能终端设备,它们整个组织体系设备都是遵循冯诺依曼体系结构。 现代计算机设备的组成部分: 运算器、控制器、存储器、输入设备、输出设备 控制器:控制器是整个计算机的枢纽,一般是控制计算机整个部件之间协调的,比如运算器要想运算的话,首先得从存储器中取出数值。或者输入设备输入数。…

    Linux干货 2016-07-07
  • 基于iptables mangle的lvs && lvs的持久连接

    一、lvs-dr类型:也称direct routing,简称为g(gatewaying);配置lvs-dr基于iptables mangle的实现方式  实验图:  地址规划:    VIP: 172.16.2.100    DIP: 172.16.2.13    RIP1:17…

    Linux干货 2015-06-30
  • 第八周

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(Bridge)是早期的两端口二层网络设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。网桥比集线器(Hub)性能更好,集线器上各端口都是共享同一条背板总线的。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch…

    Linux干货 2016-09-19
  • 第四周作业

    正则表达式练习

    Linux干货 2017-12-25