Shell 编程(五):文本三剑客之 sed(一)

简介: sed(Stream Editor)是一种流编辑器,sed 是对标准输出或文件逐行进行处理。sed 会在编辑器处理数据以前基于预先提供的一组规则来编辑数据流。能够根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

Sed 的工作模式

sed(Stream Editor)是一种流编辑器,sed 是对标准输出或文件逐行进行处理。sed 会在编辑器处理数据以前基于预先提供的一组规则来编辑数据流。能够根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

语法格式

第一种形式

stdout | sed [option] "/pattern/command"


第二种形式

sed [option] "/pattern/command" file


不加 pattern 则匹配全部

处理过程

  1. 依次次从输入中读取一行数据。
  2. 根据所提供的编辑器命令匹配数据。
  3. 按照命令修改流中的数据。
  4. 将新的数据输出到 STDOUT。

sed 的选项

选项 含义
-n 只打印模式匹配行
-e 直接在命令行进行sed编辑【默认选项】
-f 编辑动作保存在文件中,指定文件执行
-r 支持 扩展正则表达式
-i 直接修改文件内容

例子

  1. 匹配全部行
> vim sed.txt
I love python
I love php
I love PYTHON
# 不加 -n 参数默认会打印匹配行和非匹配行
> sed 'p' sed.txt
I love python
I love python
I love php
I love php
I love PYTHON
I love PYTHON
> sed -n 'p' sed.txt 
I love python
I love php
I love PYTHON


  1. 匹配字符串
> sed -n 'p' sed.txt 
I love python
I love php
I love PYTHON


  1. 匹配多个表达式
> sed -n -e '/python/p' -e '/PYTHON/p' sed.txt
I love python
I love PYTHON


  1. 指定文件执行
> vim edit.sed
/python/p
> sed -n -f edit.sed sed.txt
I love python


  1. 匹配扩展正则表达式
> sed -n -r '/python|PYTHON/p' sed.txt 
I love python
I love PYTHON


  1. 替换字符串
> sed -n 's/love/like/g;p' sed.txt    
I like python
I like php
I like PYTHON
> cat sed.txt 
I love python
I love php
I love PYTHON
> sed -i 's/love/like/g' sed.txt 
> cat sed.txt 
I like python
I like php
I like PYTHON


不加 -i 参数只会输出替换结果,并不会替换文件的内容

sed 中 pattern 详解

匹配模式 含义
10command 匹配到第10行
10,20command 匹配从第10行开始,到第20行结束
10,+5command 匹配从第10行开始,到第16行结束
/pattern1/command 匹配到pattern1的行【常用】
/pattern1/,/pattern2/command 匹配到pattern1的行开始,到匹配到pattern2的行结束【常用】
10,/pattern1/command 匹配从第10行开始,到匹配到pettern1的行结束
/pattern1/, 10command 匹配到pattern1的行开始,到第10行匹配结束

例子

  1. 直接打印第 10 行
> sed -n '10p' passwd 
operator:x:11:0:operator:/root:/sbin/nologin


  1. 指定起始行号和结束行号
> sed -n '1,10p' 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


  1. 指定起始行号,然后后面 N 行
> sed -n '8,+2p' passwd 
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


  1. 正则表达式匹配的行 【常用】
> sed -n '/^root/p' passwd
root:x:0:0:root:/root:/bin/bash


  1. 从匹配到 pattern1 的行,到匹配到 pattern2 【常用】
> sed -n '/^ftp/,/^mail/p' passwd 
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
...
redis:x:1002:1002::/home/redis:/sbin/nologin
mysql:x:1003:1003::/home/mysql:/sbin/nologin


  1. 从指定行号开始匹配,直到匹配到 pattern1 的内容
> sed -n '8,/operator/p' passwd 
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


  1. 从 pattern1 匹配的行开始,直到匹配到指定行
> sed -n '/operator/,12p' passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin


sed 中的编辑命令详解

类别 编辑命令 含义
查询 p 打印
增加 a 行后追加
增加 i 行前追加
增加 r 外部文件读入,行后追加
增加 w 匹配行写入外部文件
删除 d 删除
修改 s/old/new 将行内第一个old替换为new
修改 s/old/new/ g 将行内全部的old替换为new
修改 s/old/new/2 将行内第2个开始的old替换为new
修改 s/old/new/ig 将行内olg全部替换为new,忽略大小写

例子

  1. 删除 /sbin/nologin 登入的用户
> sed -i '\/sbin\/nologin/d' passwd
> cat passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt


  1. 删除以 mail 开头的行到以 ftp 开头的行
> sed -i '/^mail/,/^ftp/d' passwd


  1. 将能登入的用户追加一行 ‘This is user which can login to system’ passwd ’
> sed -i '/\/bin\/bash/a This is user which can login to system' passwd 
> cat passwd
root:x:0:0:root:/root:/bin/bash
This is user which can login to system
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...


  1. 将 sed.txt 内容追加 /sbin/nologin 行后
> sed -i '/root/r sed.txt' passwd 
> cat passwd 
root:x:0:0:root:/root:/bin/bash
I like python
I like php
I like PYTHON
bin:x:1:1:bin:/bin:/sbin/nologin


  1. 将匹配的 /bin/bash 行存入 user_login.txt 中
> sed -i '/\/bin\/bash/w user_login.txt' passwd 
> cat user_login.txt 
root:x:0:0:root:/root:/bin/bash


  1. 将 passwd 文件中 /sbin/nologin 替换 /SBIN/NOLOGIN
> sed -i 's/\/sbin\/nologin/\/SBIN\/NOLOGIN/g' passwd 
> cat 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


  1. 显示匹配的行号
> sed -n '/\/sbin\/nologin/=' passwd 
2
3
4
5
9
10
11


增、删、改、查都可以结合上街 sed 中 pattern 详解

反向引用

什么是反向引用?

&\1 引用模式匹配到的整个串。

sed 's/1..e/&r/g' file
sed 's/\(1..e\) /\1r/g' file

两种方式实现了一样的功能,分别使用 &\1 引用前面匹配到的整个字符串,区别在于 & 只能表示匹配到的完整字符串,只能引用整个宇符串;而 \1 可以使用 () 对匹配到的字符串。

例子

新建文件

> vim str.txt
hadoops is a bigdata frame
Spark hadoops Kafka
Skill on hadoops
Paper of hadoops


  1. 通过正则匹配 had..p 整句后加 s 【 & 反向引用】
> sed -i 's/had..p/&s/g' str.txt
> cat str.txt
hadoopss is a bigdata frame
Spark hadoopss Kafka
Skill on hadoopss
Paper of hadoopss


  1. 通过正则匹配 had..p 整句后加 doop 【 \1 反向引用】
> sed -i 's/\(had\)..p/\1doop/g' str.txt
> cat str.txt
haddoops is a bigdata frame
Spark haddoops Kafka
Skill on haddoops
Paper of haddoops


\1 相当于站位符,替换了前面的 ()。当然也可以多写几个括号,再通过 \12、…使用。

注意事项

  1. 匹配模式中存在变量,则建议使用双引号。
  2. sed 中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号。
目录
相关文章
|
6天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
6天前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
4天前
|
Shell Linux 开发工具
|
4天前
|
监控 Unix Shell
shell脚本编程学习
shell脚本编程
22 12
|
6天前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
10天前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
26 2
|
1月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
36 12
|
1月前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
41 5