码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-05-01 22:10:29      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:variable   功能   bak   注释   工作   介绍   不显示   其他   alt   

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

- 行编辑器

把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件。

- 用法
  • sed [option]... ‘script‘ inputfile...
###### - 常用选项
  • -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容
    加-n 可以只显示需要打印的行
[root@localhost home]# sed  -n ‘2,3p‘  /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
  • -e:多点编辑
[root@localhost home]# sed -n -e ‘/^$/=‘ -e ‘/^U/=‘ /etc/fstab
1
9
10
11
12
13
14
15
显示/etc/fstab中的空行和U开头的行的行号
  • -r: 支持使用扩展正则表达式
[root@localhost home]# echo /etc/sysconfig/network-scripts/ | sed -r ‘s@(^/.*/)([^/]+/?)@\2@‘
network-scripts/

取地址的基名,用正则表达式,  字符替换的方式,分两组用“()”, 第二组“^/”代表不止一个字符 “/?”代表前面的“/”可有可无,\2取第二组
  • -i .bak: 备份文件并原处编辑
[root@111 home]# echo ‘1111111‘ >f1
[root@111 home]# echo ‘2222222‘ >>f1
[root@111 home]# echo ‘3333333‘ >>f1
[root@111 home]# cat f1
1111111
2222222
3333333
[root@111 home]# sed -i.bak "2d"  f1
[root@111 home]# cat f1
1111111
3333333
[root@111 home]# cat f1.bak 
1111111
2222222
3333333

    - 加.bak是备份文件的,如果不加.bak很危险,以免失误先保存。
  • -f :/ PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
sed  -f /PATH/SCRIPT_FILE
执行脚本 给sed更多功能
- 地址定界
  • script: ‘ 地址命令‘
  • 不给地址:对全文进行处理 默认情况下显示全文
  • 单地址: #: 指定的行 “#”代表任意一行行数
  • /pattern/ :被此处模式所能够匹配到的每一行
‘/^$/‘ 匹配空行
  • #,# 第几行到第几行
/pat1/,/pat2/
匹配到的第一个字符的第一行
到匹配到的第二个字符的最后一行
  • #,/pat1/
- sed –n ‘1,4p’ /etc/passwd
   - 显示1到4行的内容
  • ~ :步进
- 1~2  只显示文件内的奇数行
   - 说明(1)~( 1,2)下一位数就是(3)
举例:seq 10 | sed -n ‘1~2p’
- 2~2 同理显示文件内的偶数行,
       - 当然奇数行偶数行显示不止这一种方式以下奇数行举例
       - seq 10|sed -n ‘1~2p‘
       - seq 10|sed ‘2~2d‘
       - seq 10|sed -n ‘2~2!p‘
       - seq 10|sed ‘n;d‘
- 编辑命令
选项介绍
d 删除模式空间匹配的行
p 显示模式空间中的内容
a []text 在指定行 后面 追加文本支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至 模式空间中匹配的行后
= 为模式空间中的行打印行号
模式空间中匹配行取反处理
s/// 查找替换, 支持使用其它分隔符,s@@@ ,s###
g 整行替换 如果不加g 只替换每行第一个匹配到的字符
w /PATH/TO/SOMEFILE 将替换成功的 行 保存至文件中

很危险的命令 替换之前先保存

3~6行打印行号
[root@111 home]# cat /etc/passwd | sed ‘3,6=‘
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6
sync:x:5:0:sync:/sbin:/bin/sync

把root替换成ROOT并保存到 p1文件中
[root@111 home]# sed -n ‘s/root/ROOT/w p1‘ /etc/passwd 
[root@111 home]# cat p1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin

给/etc/passwd文件中的第3~6行后面加上/etc/issue文件中的内容
[root@111 home]# cat /etc/passwd | sed ‘3,6r /etc/issue‘
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m

adm:x:3:4:adm:/var/adm:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m

sync:x:5:0:sync:/sbin:/bin/sync
CentOS release 6.8 (Final)
Kernel \r on an \m

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

这个例子不太明显 就是passwd中的第3~6行不显示
[root@111 home]# sed ‘3,6!p‘ /etc/passwd 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

注释全文
[root@111 home]# sed -r ‘s/^[^#]/#&/‘ /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Mar 30 04:43:20 2017
#
# 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=5bcb6b51-15c5-4820-bab4-d365adf45e81 /                       ext4    defaults        1 1
#UUID=910d7084-86b0-4de8-b3c2-c691e309f35f /apps                   ext4    defaults        1 2
#UUID=391dcc7d-a5f2-4495-bc11-d8577c48a29f /boot                   ext4    defaults        1 2
#UUID=d1c98cc5-2350-462b-a42d-5a23cad37ed9 /home                   ext4    defaults        1 2
#UUID=41ab819e-889c-4714-9fd6-1c5379f51451 /tmp                    ext4    defaults        1 2
#UUID=ee36b6c3-6e6f-4f48-bc3c-75311760e9ee swap                    swap    defaults        0 0
#tmpfs                   /dev/shm                tmpfs   defaults        0 0
#devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
#sysfs                   /sys                    sysfs   defaults        0 0
#proc                    /proc                   proc    defaults        0 0
高级编程命令
  • 烧脑模式 前方高能 请警惕
  • sed除了“模式空间”(pattern space),还有一个“hold space”内存空间,称之为保持空间

sed工作机制是每次读取一行文本至“模式空间”中,在模式空间中完成处理,将处理结果输出至标准标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可能还会有其他的处理,因此可以先把处理过的行“传送”至保持空间,然后在后续的处理中再次"传送"回模式空间中,这就类似加工车间及仓库的概念,好比模式空间是交工车间,保持空间是仓库,不过这里的仓库存放的是半成品。

选项介绍
d 删除模式空间中的行
D 删除 当前模式空间开端至\n 的内容( 不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行 覆盖 至模式空间
N 读取匹配到的行的下一行 追加 至模式空间
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中

这里举例:sed ‘1!G;h;$!d‘ FILE1 

这里用FILE1文件举例 比如文件内容总共三行 

1!G:如果不是第一行从保持空间取出内容追加至模式空间

$!d:不是最后一行删除模式空间中的行

 

技术分享

1、把FILE1文件第一行“111111”输出到模式空间 

2、把模式空间“111111”内容存至保持空间 

技术分享  

1、把FILE1文件第二行输出到模式空间             

2、把保持空间的“111111”追加至模式空间        

3、把模式空间的“222222”“111111”覆盖至保持空间   

技术分享

1、把FILE1文件第三行输出至模式空间

  2、把保持空间内容“222222”“111111”追加至模式空间

3、默认打印模式空间的内容至屏幕

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

标签:variable   功能   bak   注释   工作   介绍   不显示   其他   alt   

原文地址:http://www.cnblogs.com/MYue/p/6792836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!