超详细!SED流编辑器从入门到精通
在文本处理的世界里,SED流编辑器宛如一把瑞士军刀,功能强大且实用。无论是处理海量数据文件,还是批量修改配置文件,SED都能展现出其独特的魅力。今天,就让我们一同深入探索SED的奇妙世界,掌握其基础知识和实用技巧,让文本处理变得轻松自如。
一、SED:文本处理的神器
(一)SED是什么
SED是一款流编辑工具,专门用于对文本进行过滤与替换工作。它能够以一种高效且灵活的方式处理文本,尤其适用于大规模文本文件的操作。例如,当你面对几十个配置文件需要进行统一修改时,SED就能发挥巨大作用,让你在短时间内完成任务。
(二)SED的工作流程
- 读取文件:SED通过文件或管道读取文件内容,每次仅读取一行,这使得它在处理大数据文件时不会占用过多内存,保证了处理效率。
- 模式空间操作:读取的内容会被复制到缓冲区,也就是模式空间(pattern space)。在这里,SED根据指令对内容进行处理。
- 输出结果:处理后的结果默认输出至标准输出,即屏幕上。如果需要,也可以将结果保存到文件中。
以下是SED工作流程的示意图:
输入
------------------------------------------------
|
|
v
读取一行内容,并复制到模式空间 <------------ sed指令
|
|
v
------------------------------------------------
输出经过处理后的内容
二、SED基本语法:开启文本处理之旅
(一)基本语法格式
sed Options... [script] [inputfile...]
其中,Options
是SED程序本身的选项,用于控制SED的行为;script
是脚本指令,用于指定对文件内容的操作;inputfile
是输入文件,如果没有指定,则SED默认对标准输入进行处理(如键盘输入)。
(二)常用选项解析
- 显示版本和帮助
--version
:显示SED版本。--help
:显示帮助文档。
- 控制输出
-n,--quiet,--silent
:静默输出,屏蔽SED程序自动打印模式空间内容的功能。
- 执行脚本指令
-e script
:允许多个脚本指令被执行。-f script-file, --file=script-file
:从文件中读取脚本指令,方便编写自动脚本程序。
- 修改源文件(谨慎使用)
-i,--in-place
:直接修改源文件,处理后的内容将覆盖源文件内容。
- 其他选项
-l N, --line-length=N
:指定l
指令输出的行长度,l
指令用于输出非打印字符。--posix
:禁用GNU SED扩展功能。-r, --regexp-extended
:在脚本指令中使用扩展正则表达式。-s, --separate
:控制SED对多个文件名的处理方式。-u, --unbuffered
:最低限度缓存输入与输出。
(三)简单案例演示
- 追加与插入
假设我们有一个名为test.txt
的文件,内容如下:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
- 在第二行后添加
TYPE=Ethernet
:
sed '2a TYPE=Ethernet' test.txt
- 在第三行前添加
TYPE=Ethernet
:
sed '3i TYPE=Ethernet' test.txt
- 替换
将文件中所有的yes
替换为no
:
sed's/yes/no/g' test.txt
- 删除
删除第3至4行的内容:
sed '3,4d' test.txt
- 使用正则表达式定位操作行
- 匹配到包含
ONBOOT
的行,并在其后添加TYPE=Ethernet
:
sed '/ONBOOT/a TYPE=Ethernet' test.txt
- 匹配以
GATEWAY
开始的行,并删除该行:
sed '/^GATEWAY/d' test.txt
- 从脚本文件中读取指令
创建一个名为sed.sh
的脚本文件,内容如下:
/^$/d
这条指令的作用是删除空白行。然后执行:
sed -f sed.sh test.txt
- 执行多个指令的方法
- 使用分号隔开指令:
sed's/yes/no/;s/static/dhcp/' test.txt
- 使用
-e
选项:
sed -e's/yes/no/' -e's/static/dhcp/' test.txt
- 利用分行指令:
sed '
s/yes/no/
s/static/dhcp/' test.txt
三、正则表达式:精准定位文本
(一)确定操作地址
- 行号指定
number
:指定输入文件的唯一行号,如2d
表示删除第二行。first~step
:以first
开始,操作步长为step
,如1~2
表示打印文件的奇数行。$
:匹配文件的最后一行。
- 正则表达式匹配
/regexp/
:通过正则表达式匹配操作地址,例如/ONBOOT/
匹配包含ONBOOT
的行。\cregexpc
:匹配扩展正则表达式,c
字符可以使用任意字符替代。
- 范围指定
addr1,addr2
:匹配从操作地址1
到操作地址2
的所有行,如2,8d
删除2至8中间的所有行。addr1,+N
:匹配地址1
以及后面的N
行内容。
(二)正则表达式概述
- 字符匹配
char
:字符本身匹配字符本身,如/abc/
定位包含abc
的行。
- 数量限定符
*
:匹配前面表达式出现了0或若干次,如/a*/
可以找到a
、aa
、aaa
等。\+
(扩展正则表达式):匹配前面表达式的1次或多次。\?
(扩展正则表达式):匹配前面表达式的0次或1次。\{i\}
:匹配前面表达式的i
次(i
为整数),如a\{3\}
找到aaa
。\{i,j\}
:匹配前面表达式的i
到j
次,如a\{1,2\}
找到a
或aa
或aaa
。\{i,\}
:匹配前面表达式至少i
次。
- 分组与引用
()
:将内的模式存储在保留空间,最多可存储9个独立子模式,可通过转义\1
至\9
重复保留空间的内容。
- 其他元字符
.
(点):匹配任意字符。^
:匹配行的开始,如^test
匹配所有以test
开始的行。$
:匹配行的结尾,如test$
匹配所有以test
结尾的行。[]
:匹配括号中的任意单个字符,如a[nt]
匹配an
或at
。[^]
:匹配不包含在[]
中的字符,如[^a-z]
匹配除a-z
以外的字符。\n
:匹配换行符。\char
:转义特殊字符,如\*
匹配字面意义上的星号。
四、SED脚本指令:实现多样化操作
(一)注释(#)
注释行以#
开始,如果#
后面的字符为n
,则屏蔽SED程序的自动输出功能,等同于命令选项-n
。
(二)替换(s)
- 基本格式
[address]s/pattern/replacement/flags
其中,address
为操作地址,s
为替换指令,/pattern/
匹配要替换的内容,/replacement/
为替换的内容,flags
可以是:n
(1至512之间的数字):表示对模式空间中指定模式的第n
次出现进行替换。g
:对模式空间的匹配进行全局更改,没有g
则仅第一次匹配被替换。p
:打印模式空间的内容。w file
:将模式空间的内容写到文件file
中。
- 示例
假设有一个名为test.txt
的文件,内容如下:
<html>
<title>First Web</title>
<body>Hello the World! <body>
</html>
将样本文件中的第二个<body>
替换为</body>
。
编写sed.sh
脚本如下:
/body/{
s//\/body/2
}
执行sed
程序:
sed -f sed.sh test.txt
结果为:
<html>
<title>First Web</title>
<body>Hello the World!</body>
</html>
(三)删除(d)
删除指令删除匹配的行,且会改变SED脚本中命令的执行顺序。因为匹配的行被删除后,模式空间变为“空”,SED脚本后续命令不再执行,而是读取新的输入行,从头开始执行命令。
(四)追加(a)
在匹配行后追加内容。例如,对于文件test.txt
:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
执行sed '/static/a IPADDR=192.168.0.1' test.txt
,会在包含static
的行后添加一行IPADDR=192.168.0.1
。
(五)插入(i)
在匹配行前插入内容。如sed '/NETMASK/i IPADDR=192.168.0.1' test.txt
,会在包含NETMASK
的行前添加一行IPADDR=192.168.0.1
。
(六)更改(c)
更改匹配行的内容。例如,sed '/ONBOOT/c ONBOOT=yes' test.txt
会将包含ONBOOT
的行(整行)替换为ONBOOT=yes
。
(七)列印(l)
显示模式空间中的内容,显示非打印字符,一般与-n
一起使用,否则会输出两次。例如,sed -n '1,2l' test.txt
会显示文件的第一、二行内容及换行符(以$
表示)。
(八)转换(y)
按字符进行转换。例如,对于文件test.txt
:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
netmask=255.255.255.0
GATEWAY=192.168.0.254
编写sed.sh
脚本:
/.*/{
/netmask/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
}
执行sed -f sed.sh test.txt
,会将netmask
中的小写字母转换为大写字母。
(九)打印(p)
作用类似于l
,但不显示非显示字符,一般与-n
配合使用。如sed -n '1,2p' test.txt
仅显示第一、二行内容。
(十)读写文件(r,w)
- 读取文件(r)
[line-address]r file
,例如,有name.txt
和mail.txt
两个文件:
name.txt
内容:
Jacob
Tom
Jerry
mail.txt
内容:
jacob@gmail.com
tom@gmail.com
jerry@gmail.com
编写sed.sh
脚本:
/.*/{
$r mail.txt
}
执行sed -f sed.sh name.txt
,会在name.txt
文件末尾添加mail.txt
的内容。
2. 写入文件(w)
[address]w file
,可以将指定行的内容写入到文件中。
(十一)退出(q)
匹配地址后退出SED脚本。例如,sed '10q' test.txt
会打印文件前10行内容后退出。
(十二)下一步(n)
[address]n
,输出模式空间中的内容,然后读取输入的下一行。例如,对于文件name.txt
:
Jacob
Tom
Jerry
编写sed.sh
脚本:
/.*/{
n
/.*/d
}
执行sed -f sed.sh name.txt
,会删除偶数行,结果为:
Jacob
Jerry
(十三)Next(N)
多行Next(N)
命令通过读取新的输入行,并将它添加到模式空间的现有内容之后,来创建多行模式空间。模式空间的最初内容与新的输入行之间用换行符分隔。例如,对于文件test.txt
:
111
222
222
333
编写sed.sh
脚本:
#n
/222/{
N
l
}
执行sed -f sed.sh test.txt
,结果如下:
222\n222
(十四)Print(P)
多行打印(P)与打印(p)稍有不同,该命令仅输出多行模式空间中的第一部分,直到第一个插入的\n
换行符为止。例如,对于文件test.txt
:
111
222
333
444
555
666
编写不同的sed.sh
脚本并执行,结果如下:
- 脚本1:
/.*/{
N
}
结果:
111
222
333
444
555
666
- 脚本2:
/.*/{
N
l
}
结果:
111\n222$
111
222\n333$
222
333\n444$
333
444\n555$
444
555\n666$
555
666
- 脚本3:
/.*/{
N
P
}
结果:
111
111
222
222
333
333
444
444
555
555
666
666
- 脚本4:
/.*/{
N
p
}
结果:
111
222
111
222
333
444
333
444
555
666
555
666
(十五)Delete(D)
删除命令(D)删除模式空间中直到第一个插入的换行符(\n
)前的这部分内容,它不会读入新的输入行,并返回SED脚本的顶端,使得剩余指令继续应用于模式空间中剩余的内容。
(十六)Hold(h,H),Get(g,G)
模式空间用于存放当前输入行,还有一个保持空间(hold space)。可以使用以下命令在两者之间移动数据:
Hold(h|H)
:将模式空间的内容复制或追加到保持空间。Get(g|G)
:将保持空间的内容复制或追加到模式空间。Exchange(x)
:交换保持空间与模式空间的内容。
例如,对于文件test.txt
:
1
2
11
22
111
222
编写sed.sh
脚本:
/1/{
h
d
}
/2/{
G
}
执行sed -f sed.sh test.txt
,结果为:
2
1
22
11
222
111
(十七)branch,test
分支(b)和测试(t)命令用于控制SED脚本的执行流程。分支命令是无条件转移,测试命令用于有条件转移,测试只有当替换命令改变当前行成功时才会执行。标签是任意不多于7个字符的序列,以冒号开始,如:mylable
。在分支或测试命令
作者:代老师的编程课
出处:https://zthinker.com/
如果你喜欢本文,请长按二维码,关注 Java码界探秘
.
超详细!SED流编辑器从入门到精通的更多相关文章
- Linux三剑客之sed流编辑器
一.功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. 二.语法格式 Usage: sed [options] [se ...
- 【Shell案例】【!~//、grep反向查找、sed流编辑器】13、去掉所有包含this的句子
描述写一个 bash脚本以实现一个需求,去掉输入中含有this的语句,把不含this的语句输出示例:假设输入如下:that is your bagis this your bag?to the deg ...
- Linux下的sed流编辑器命令详解
sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...
- Linux sed 流编辑器
sed是stream editor的简称,也就是流编辑器.盗用一张图片解释原理 命令格式: SYNPPSIS: sed [OPTION]… {script-only-if-no-other-scrip ...
- sed流编辑器
一.前言 (一).sed 工作流程 sed 是一种在线的.非交互式的流编辑器,它一次处理一行内容.处理时,把当做前处理的行存储在临时缓存区中,成为“模式空间”(pattern space),接着用se ...
- Shell:sed流编辑器
转载:http://blog.sina.com.cn/s/blog_ac9fdc0b0101lvdv.html sed和awk是永远地痛,学了又忘,主要是木有横向对比过,所以总把握不到精髓.它可以完美 ...
- Python入门教程 超详细1小时学会Python
Python入门教程 超详细1小时学会Python 作者: 字体:[增加 减小] 类型:转载 时间:2006-09-08我要评论 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Ja ...
- Python入门教程 超详细1小时学会Python
Python入门教程 超详细1小时学会Python 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的 ...
- Shell 基础 -- 流编辑器 sed 详解
一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...
- 流编辑器sed知识点总结
sed(流文本编辑器) 每次读取一行到模式空间中, 修改的sed模式空间中的内容,并不会修改源文件, 继而输出模式空间的内容, 最后删除模式空间中的内容. sed [O ...
随机推荐
- web前端使用mcg-helper代码生成工具学习笔记
学习资料介绍 github地址:mcg-helper代码生成工具 什么是 FreeMarker? - FreeMarker 中文官方参考手册 视频学习地址: 第一节.视频教程内容介绍 探讨研发工作 ...
- Bit, Byte, ASCII, Unicode, UTF, Base64
前言 做项目偶尔会接触到 stream 这个感念,不管是 memory stream 还是 file stream,它们又会提到 bytes. 还有像 Identity – 安全基础知识 中提到的 S ...
- C# + WPF 音频播放器 界面优雅,体验良好
前言 本文介绍一款使用 C# 与 WPF 开发的音频播放器,其界面简洁大方,操作体验流畅.该播放器支持多种音频格式(如 MP4.WMA.OGG.FLAC 等),并具备标记.实时歌词显示等功能. 另外, ...
- BFS 马的遍历————洛谷p1443
马的遍历 题目描述 有一个 \(n \times m\) 的棋盘,在某个点 \((x, y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步. 输入格式 输入只有一行四个整数,分别为 ...
- ShiftAddAug:基于乘法算子训练的最新无乘法网络方案 | CVPR'24
不包含乘法的运算符,如移位和加法,因其与硬件的兼容性而日益受到重视.然而,采用这些运算符的神经网络(NNs)通常表现出比具有相同结构的传统NNs更低的准确性.ShiftAddAug利用成本较高的乘法来 ...
- Nuxt.js 应用中的 app:mounted 钩子详解
title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: ap ...
- Windows应急响应-Auto病毒
目录 应急背景 分析样本 开启监控 感染病毒 查看监控 分析病毒行为 autorun.inf分析 2.异常连接 3.进程排查 4.启动项排查 查杀 1.先删掉autorun.inf文件 2.使用xue ...
- Android应用启动全流程分析(源码深度剖析)
目录 1.前言 2.大纲 3. Input触控事件处理流程 3.1 系统机制分析 3.2 结合Systrace分析 4. 应用进程的创建与启动 4.2 创建应用进程 4.2.1 AMS 发送socke ...
- /proc/sys/vm 使用
这些参数主要是用来调整virtual memory子系统的行为以及数据的写出(从RAM到ROM). 这些节点(参数)的默认值和初始化的过程大部分都可以在mm/swap.c中找到. 目前,/proc/s ...
- window配置onnxruntime,运行c++版本
为了使用ONNX-Runtime-Inference这个项目,但是我缺少onnxruntime这个库, 网上找了很多教程,但是大多数都是关于linux的,这里简单记录一下我的配置流程 找到onnxru ...