文本三剑客之sed

目录

概述

基本语法

命令

选项

示例

查找替代

示例


概述

sed是文本处理工具,依赖于正则表达式,可以读取文本内容,根据指定条件对数据进行添加、删除、替换等操作,被广泛应用于shell脚本,以完成自动化处理任务。

    sed在处理数据时默认不直接修改源文件,而是把当前处理的行存储在缓冲区中,所有指令都在缓冲区中操作,处理完成后,把缓冲区内容默认输出到屏幕,接着处理下一行内容,这样不断重复,直到文件末尾,文件本身内容没有改变。

sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  • 1、每次仅读取一行内容
  • 2、根据提供的规则命令匹配并修改数据。注意,sed默认不会直接修改文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据
  • 3、将执行结果输出

当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕

基本语法

sed -e '编辑指令' 文件1 文件2 ...

sed -n -e '编辑指令' 文件1 文件2 ...

sed -i -e '编辑指令' 文件1 文件2 ...

格式

sed [选项]  [脚本命令] 文件名

命令

  • p  打印当前模式空间内容,追加到默认输出之后
  • Ip  忽略大小写输出
  • d   删除模式空间匹配的行,并立即启用下一轮循环
  • a [\]test  在指定行后面追加文本,支持使用\n实现多行追加
  • i [\]test   在行前面插入文本
  • c [\]test  替换行为单行或多行文本
  • w file    保存模式匹配的行至指定的文件 seq 10 |sed -n '2wa.txt'
  • r file    读取指定文件的文本至模式空间中匹配到的行后  seq 10|sed '2r /etc/issue'
  • =   为模式空间中的行打印行号 sed '2=' /etc/passwd  sed -n -e '=;p' /etc/passwd
  • !   模式空间中匹配行取反处理 sed 10|sed -n '1~2!p'
  • q   结束或退出sed  seq 10|sed '3q'

选项

-n 关闭自动打印功能

-d 删除

-i  与  -i.bak  修改文件    修改文件前先备份

-a  追加

示例

打印/etc/passwd第六行

[root@mjy ~]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

打印/etc/passwd第三行到第六行

[root@mjy ~]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@mjy ~]# sed -n '3,6p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

打印奇数行

[root@mjy ~]# seq 10 |sed -n 'p;n'
1
3
5
7
9

打印偶数行

[root@mjy ~]# seq 10 |sed -n 'n;p'
2
4
6
8
10

在第六行后面追加

[root@mjy ~]# seq 10 |sed '6ahi'
1
2
3
4
5
6
hi
7
8
9
10

查找替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:

  • g 行内全局替换
  • p 显示替换成功的行
  • w /PATH/FILE 将替换成功的行保存至文件中
  • I,i 忽略大小写

示例

将/etc/passwd中包含root的行中的root替换为ROOT

[root@mjy ~]# sed '/root/s/root/ROOT/g' /etc/passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
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
operator:x:11:0:operator:/ROOT:/sbin/nologin

可排序

[root@mjy ~]# echo 123abc689 |sed -r 's/(123)(abc)(689)/\1/'
123
[root@mjy ~]# echo 123abc689 |sed -r 's/(123)(abc)(689)/\1\3/'
123689
[root@mjy ~]# echo 123abc689 |sed -r 's/(123)(abc)(689)/\3\2\1/'
689abc123

提取版本号

[root@mjy ~]# vim mian.txt

ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
~

[root@mjy ~]# cat mian.txt|sed -r 's/.*-(.*)\.jar/\1/'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5
                                  

你可能感兴趣的:(shell脚本,linux,运维,服务器)