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

文本处理三剑客之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:多点编辑
[[email protected] home]# sed -n -e ‘/^$/=‘ -e ‘/^U/=‘ /etc/fstab
1
9
10
11
12
13
14
15
显示/etc/fstab中的空行和U开头的行的行号
  • -r: 支持使用扩展正则表达式
[[email protected] home]# echo /etc/sysconfig/network-scripts/ | sed -r ‘[email protected](^/.*/)([^/]+/?)@\[email protected]‘
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/// 查找替换, 支持使用其它分隔符,[email protected]@@ ,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、默认打印模式空间的内容至屏幕

时间: 2024-10-23 20:43:42

文本处理三剑客之sed(流编辑器)的相关文章

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

流编辑器 sed 模式空间,默认不编辑原文件,仅对模式空间中的数据做处理:处理结束后,将模式空间中数据打印至屏幕.sed是一个行编辑器. sed [options] 'Address Command' file ... Option: -n: 静默模式, 不再默认显示模式空间中的内容-i: 直接修改原文件-e SCRIPT 可以同时执行多个脚本, 操作-f /PATH/TO/SED_SCRIPT  如: sed -f /path/to/scripts file ( 指定 sed 的脚本文件)-r

文本处理工具之SED流编辑器

文本处理三剑客之SED(流编辑器) sed的工作方式:在指定文件中,按行读取内容至模式空间,然后根据sed的scripts编辑改行内容,编辑完毕后输出至屏幕,再读取下一行进行处理.如果有该行内容未被处理完毕就有新的内容要进行编辑,则把该行内容移至保持空间中,,保持空间中的内容可以随时调回模式空间中. sed的使用 使用格式:sed [options...] 'scipts' file 常用选项: -n:不输出模式空间中的内容至标准输出(不自动打印) -e script:多点编辑sed -e '[

文本处理三剑客之sed

文本处理三剑客之sed sed概述 sed使用示例 sed的高级应用 sed概述 sed, 作为文本三剑客之一,其定位就是一个编辑器, 而且sed是一个流式编辑器(stream editor),其主要功能是过滤和转换文本. sed - stream editor for filtering and transforming text 作为一个强大的文本处理功能,sed 自然能够配合正则表达式,另外,所谓流编辑器,sed 是逐行地读取文本,在文本行中应用指定的命令,且默认输出到stdout; se

文本工具三剑客:sed

文本工具三剑客:sedsde是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓存区,称为 模式空间    用法:    sed [选项] [加自己的语言] [要处理的文件]    选项:        -n  不输出模式中的内容至屏幕            # sed -n "10p" f2 只打印出第10行匹配到的行 其他不显示            10  UUID=07a475f4-3d7a-4b27-9ec9-500bc8a19c4d /boot      

Linux 篇 | 文本处理三剑客之SED

文本处理三剑客之SED sed不仅可以像grep过滤文件,查找想要的内容,还可以更改文件,这是grep做不到的. 一.sed介绍 Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.然后读入下行,执行下一个循环.如果没有使诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间.这

Linux基础之sed流编辑器详解

之前介绍了三大文本编辑器的grep,这里介绍比grep功能更强的sed流编辑器 sed是什么? sed是Stream EDitor的缩写,man中对sed的简洁为 sed - stream editor for filtering and transforming text 它的主要功能是对文本的过滤与替换. sed的工作原理 sed的工作过程:sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果

Linux文本处理“三剑客”之sed

sed(Stream Editor)是一个行编辑工具.下面我们介绍 sed 的实现原理和基本使用方法. 一.sed 的处理文本的流程 基本处理流程如下: 处理流程是:每次读入文本文件的一行到内存中的模式空间中,在模式空间中处理后将处理的结果输出,默认会打印到屏幕上.因此,默认情况下,不会改变原文件的内容. 二.sed 命令的使用 基本语法:sed [options]... '地址定位 编辑命令' FILE... 地址定位的方法: 1.行定位: start_line[,end_line] 2.模式

文本处理三剑客之-sed基础用法

文本处理三剑客: grep,egrep,fgrep:文本过滤器 sed:stream EDitor:流编辑器,行 awk:文本格式化工具,报告生成器 sed [OPTION]...'script' [input-file]      script:地址定界编辑命令                [option]           -n:不输出模式空间中的内容至屏幕           -e:多点编辑           -f /path/to/sed_script_file:         

8.9_Linux文本处理三剑客之sed和文本编辑利器vim的使用

本文处理三剑客之sed的使用   什么是sed? Stream EDitor(简称sed), 行编辑器,一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上. sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多