Sed中级教程:在Linux环境下操作文本流

中级sed实战:Linux文本流水线的核心能力解析 sed(Stream Editor)是Linux系统中专为文本流处理设计的轻量级编辑器,其核心原理在于基于模式空间的单行/多行流式处理,不加载全文、不维护上下文、不解析结构,仅通过地址范围、替换标志、保持空间等机制实现高效变形。这种‘无状态流水线’特性赋予它在日志清洗、配置批量修改、安全审计等场景中不可替代的技术价值——尤其在Kubernetes YAML处理、Nginx配置运维、Kali渗透测试等高频工程实践中,sed常与grep、awk协同构成文本处理黄金三角。本文聚焦GNU sed与BSD sed的兼 阅读详情

提供:ZStack云计算

系列教程

本教程为Sed使用指南两篇中的第二篇。

内容介绍

Sed流编辑器是一款功能强大的编辑工具,能够利用极少输入内容完成多种操作。在上一篇教程里,我们探讨了sed文本编辑器基础知识。

本文将继续介绍其它更为先进的议题。

提供多个编辑序列

有时候,我们可能需要同时向sed发送多条命令。大家可以通过多种方式实现这一效果。

如果需要编辑的文件尚不存在,在这里我们重新创建以完成接下来的操作:

cd
cp /usr/share/common-licenses/BSD .
cp /usr/share/common-licenses/GPL-3 .
echo "this is the song that never ends
yes, it goes on and on, my friend
some people started singing it
not knowing what it was
and they'll continue singing it forever
just because..." > annoying.txt

由于sed通过标准输入与输出进行操作,因此我们需要通过一条管道将不同调用整合起来(请记得注释掉&,因为这意味着使用完全匹配模式):

sed 's/and/\&/' annoying.txt | sed 's/people/horses/'

this is the song that never ends
yes, it goes on & on, my friend
some horses started singing it
not knowing what it was
& they'll continue singing it forever
just because...

效果还可以,不过其中包含了一些不必要的调用,占用了更多空间且无法发挥sed的内置功能。

我们可以在各命令前使用-e选项对多条命令进行合并:

sed -e 's/and/\&/' -e 's/people/horses/' annoying.txt

另一种命令整合方法是使用分号字符来分隔不同命令,具体方式与上一条基本相同:

sed 's/and/\&/;s/people/horses/' annoying.txt

注意,在使用-e构建命令时,我们需要使用引号对不同命令进行分组。不过在使用引号时,全部命令都可包含在单一引号组之内。

虽然这两种方式都很可行,但有时候我们仍然需要使用前面提到的管道模式以实现某些特定功能。

例如“=”操作符。此操作符会在各现有行之间插入一个数字行,输出结果如下:

sed '=' annoying.txt

1
this is the song that never ends
2
yes, it goes on and on, my friend
3
some people started singing it
4
not knowing what it was
5
and they'll continue singing it forever
6
just because...

但大家会发现,我们无法通过修改文本内容来改变其编号格式。

出于演示的考虑,我们在这里使用“G”命令,其默认情况下会在每行之间插入一个空行。

sed 'G' annoying.txt

this is the song that never ends

yes, it goes on and on, my friend

some people started singing it

not knowing what it was

and they'll continue singing it forever

just because...

将这两条命令结合起来,照理说内容行与编号行之间应该会增加一个空行,但实际情况并非如此:

sed '=;G' annoying.txt

1
this is the song that never ends

2
yes, it goes on and on, my friend

3
some people started singing it

4
not knowing what it was

. . .
. . .

这是因为“=”操作符直接修改了输出流,意味着我们无法直接对结果加以进一步编辑。

我们可以使用两条sed调用解决这一问题,即将第一条sed修改作为简单文本流,以供第二条命令操作:

sed '=' annoying.txt | sed 'G'

1

this is the song that never ends

2

yes, it goes on and on, my friend

3

some people started singing it
. . .
. . .

这次结果就与预期相符了。请注意,部分常见操作需要依此进行,特别是在将多条命令加以结合时,结果往往会与预期不符。

高级寻址

Sed addressable命令的最大优势之一,在于可利用正则表达式作为选择标准。这意味着我们不必受限于之前提到的各类已知行值:

sed '1,3s/.*/Hello/' annoying.txt

Hello
Hello
Hello
not knowing what it was
and they'll continue singing it forever
just because...

相反,我们也可以使用正则表达式匹配包含特定模式的行。我们可以在命令中在两个斜杠(/)内添加匹配模式:

sed '/singing/s/it/& loudly/' annoying.txt

this is the song that never ends
yes, it goes on and on, my friend
some people started singing it loudly
not knowing what it was
and they'll continue singing it loudly forever
just because...

在本示例中,我们将“loudly”放在包含有“singing”字符串的各行的第一个“it”之后。注意,第二与第四行并不符合这一模式,因此内容并未变化。

我们还可以进一步提升寻址表达式的复杂性,从而灵活地执行各项命令。

示例本身并不复杂,但我们可以使用正则表达式为其它命令生成地址。以下命令中,其匹配任意空行(即行的开头与结尾紧密连接),而后将空行删除:

sed '/^$/d' GPL-3

                GNU GENERAL PUBLIC LICENSE
                   Version 3, 29 June 2007
 Copyright (C) 2007 Free Software Foundation, Inc. 

 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.
                        Preamble
  The GNU General Public License is a free, copyleft license for
. . .
. . .

注意,正则表达式可在任意范围的任意一端进行使用。

例如,我们可以删除包含“START”的行与包含“END”的行之间的各行:

sed '/^START$/,/^END$/d' inputfile

这里需要强调的是,此操作将删除第一条“START”与第一条“END”间的全部内容,而后在遇到下一个“START”标记后再执行一次。

如果我们需要反转地址(操作任何不匹配模式的行),则可在模式后添加感叹号。

例如,我们可以删除一切非空行(没什么用,仅作为示例):

sed '/^$/!d' GPL-3

使用“保持缓存(Hold Buffer)”

保持缓存,即hold b uffer,能够切实提升sed的多行编辑能力。保持缓存是一种临时存储区,可通过特定命令进行修改。

利用这种额外的缓冲区,我们可以在操作某些行的时候将其它行存储在其中,而后在必要时使用这些缓冲内容。

以下为保持缓存中的各命令及作用:

  • h: 将当前模式缓冲区(即我们当前匹配并在处理的行)复制到保持缓存内(这会覆盖缓冲区的原有内容)。
  • H: 将现有模式缓冲区附加到当前保持缓存末尾,以新行符(\n)分隔。
  • g: 将现有保持缓存复制到当前模式缓存当中。这会覆盖掉原有模式缓存。
  • G: 将当前保持模式附加到当前模式缓存末尾,以新行符(\n)分隔。
  • x: 交换当前模式与保持缓存。

保持缓存中的内容无法直接操作,直到其被转移至模式缓存。

下面来看看比较复杂的示例。

以下示例为如何合并相邻行(sed提供内置命令执行此类任务。其中N命令会将下一行合并至当前行中):

sed -n '1~2h;2~2{H;g;s/\n/ /;p}' annoying.txt

this is the song that never ends yes, it goes on and on, my friend
some people started singing it not knowing what it was
and they'll continue singing it forever just because...

下面来看命令的具体内容。

首先是“-n”选项,其用于禁用自动输出。如此一来,sed只会输出我们要求其输出的内容。

脚本的第一部分为“1~2h”。开头为地址指定,代表着在第一行执行序列操作,而后每隔一行进行操作(即各奇数行)。“h”部分要求该命令将匹配的行复制到保持缓存当中。

命令的下半部分较为复杂。其同样以地址指定开头,这一次引用的是编号行(与第一条命令不同)。

命令的其余部分放置在括号当中。意味着命令其余部分将继承之前指定的地址。如果没有括号,则只有“H”命令会继承该地址,而其余部分则在每行上执行。

“H”命令会复制一个新行符,其后为当前模式缓存,最后为当前保持缓存。

此保持模式(一个奇数行,随后是一个新行符,最后是编号行)随后通过“g”命令被复制回模式缓存(覆盖此前的模式缓存)。

接下来,该新行符被替换为空格,该行则以“p”命令进行输出。

如果使用“N”命令,那么如上所述,命令内容会大大缩短而结果不变:

sed -n 'N;s/\n/ /p' annoying.txt    

this is the song that never ends yes, it goes on and on, my friend
some people started singing it not knowing what it was
and they'll continue singing it forever just because...

使用Sed脚本

在使用更为复杂的命令之前,我们可以先在文本编辑器中进行命令汇总。通过这种方式,我们能够针对单一目标执行大量命令操作。

例如,如果大家希望撰写纯文本信息,但又需要在使用文本前将其整理为某种标准化格式,则可使用sed脚本来简化整个过程。

无需逐个输入命令,我们可以将各命令纳入一套脚本,并将其作为参数提交给sed。一套sed脚本就相当于一份原始sed命令列表(通常包含在单引号之内)。

例如:

s/this/that/g
s/snow/rain/g
1,5s/pinecone/apricot/g

而后我们可以使用以下语法调用该文件:

sed -f sedScriptName fileToEdit

如此一来,我们就能够编辑文件并借此创建任意需要的文本格式了。

总结

在本教程中,我们更为深入地对sed进行了论述。

Sed的命令在刚接触时显得难以理解,而且通常需要不断实验才能掌握其用法。因此,请大家多加练习以巩固体会。

不过相信大家也已经从示例中感受到了sed的强大能力,希望睿智的你能够进一步发挥想象力,凭借这款出色的工具更好地完成日常任务。

本文来源自DigitalOcean Community。英文原文:Intermediate Sed: Manipulating Streams of Text in a Linux Environment By Justin Ellingwood

翻译:diradw

linux运维视频教程全集(初级、中级和高级共200讲,73个G) linux运维视频教程全集(初级、中级和高级共200讲,73个G) 保函 视频 PPT 资料 都有 一共73G 立即下载

相关推荐

linux运维视频教程全集(初级、中级和高级).zip

linux运维视频教程全集(初级、中级和高级)包括:bash脚本、Linux操作系统基础、磁盘及文件系统管理、Raid及mdadm命令、LVM、Linux网络配置等相关视频

【Linux进阶命令 03】sed (文本的流编辑器)

03 sed命令

风高秋月白,雨霁晚霞红 1088

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2188

Linux系统使用(非常详细)从零基础入门到精通,看完这一篇就够了

Linux提供了 ll 命令。此命令等价于ls -l上述的这些选项,也叫做命令行参数。注意:命令行的参数与参数之间,需要一个空格进行分割。

qinglp的博客 1607

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 677

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码)

本文深入解析了Facebook登录协议的逆向工程实战,详细拆解了从关键加密参数(如`lgndim`、`encpass`)定位到完整登录流程的实现。文章提供了Python代码示例,重点阐述了加密逻辑的深度解析、加密函数的本地化实现,并解决了Crypto.js异步调用等常见问题,为研究Web安全和协议逆向的开发者提供了实用参考。

metal的博客 1316

linux中级教程-中级shell

1、变量 linux中的变量分为两类,用户(环境)变量和临时(本地)变量。环境变量存在于所有shell中。本地变量存在于当前shell中,所以本地变量中一定有环境变量。注意是shell不是用户,所以如果一个用户打开了多个shell,它们之间的非环境变量的本地变量是不能共享的。 (1)环境变量的设置过程如下          每一次用户登录时/etc/profile文件被读取,设置变量   

define_us的专栏 1228

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 109

linux上sed的常用操作

linux上sed的常用操作

松果177的博客 1195

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

9.13华为OD机试真题 新系统 - 手机桌面整理 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【手机桌面整理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【 手机桌面整理】多语言题解。

qq_45776114的博客 642

每天一个 Linux 知识:使用 sed 修改文本流

sedsed这种“逐行处理”的模式使其能高效处理大型文件(如GB级日志),且默认不修改原文件(仅输出修改后的结果),避免误操作导致数据丢失——这是sed与交互式编辑器(如vim)的核心区别。例如,执行时,sed会逐行读取test.txt,将每行中的第一个“old”替换为“new”,然后输出修改后的行,原文件test.txt内容保持不变。

网络技术联盟站 942

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(上)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2778

Linux 常用工具:sed cut awk

sed(Stream Editor)是一个非常强大的流编辑工具,用于对输入的文本流进行处理,它通过读取标准输入或文件内容进行实时编辑,不需要手动打开文件,它支持多种文本处理操作,包括替换、删除、插入等。

2403_88668158的博客 1406

OpenClaw-遇到的问题-Health check failed: gateway closed (1006 abnormal closure (no close frame)): no clos

OpenClaw网关服务安装成功但运行异常,显示健康检查失败(错误代码1006)。系统提供了Web控制界面(http://127.0.0.1:18789/)和带令牌的安全访问链接。文档建议参考故障排除指南,并提供了可选应用扩展功能(包括移动端支持)。注意运行本地代理存在安全风险,建议加固系统配置。若需启用网络搜索功能,需配置Brave搜索API密钥。安装完成后会自动打开仪表盘,需保持浏览器标签页以控制OpenClaw服务。

直到世界的尽头 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux基础命令介绍:文本流编辑 sed

与vim不同,sed是一种非交互式的文本编辑器,同时它又是面向字符流的,每行数据经过sed处理后输出。 sed [OPTION]... [script] [file]... sed的工作过程是这样的:首先,初始化两个数据缓冲区模式空间和保持空间;sed读取一行输入(来自标准输入或文件),去掉结尾的换行符(\n)后置于模式空间中,然后针对模式空间中的字符串开始执行‘sed命令’,每个命令都可以...

guying4875的专栏 379

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux中sed

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

qq_62693973的博客 1938

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux工具-sed

举例说明[aeiou]任意元音字母[0-9]任意数字, -表示范围等价于\w举例# 使用字符集, 中括号不需要转义。

编程驴子的博客 819

linux命令学习-sed命令

sed是一个功能强大的流式文本编辑器。主要用于对文本流进行修改、替换、删除等操作。它可以读取文件或标准输入,进行各种编辑操作,然后将结果输出到标准输出或文件中。把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)【sed是行处理的编辑器】用sed命令处理缓冲区中的内容;处理完成后,把缓冲区的内容送往屏幕,也可以重定向到文件中,注意,原文件内容本身没有变化。接着处理下一行,这样不断重复,直到文件末尾sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;

qq_40840571的博客 1926

Linux的SED文本流编辑(新手必看)

Linux的SED文本流编辑(新手必看)

weixin_64081179的博客 1244

linux中sed -n,linux中的sed命令

Linux系统中的sed命令主要是利用script来处理文件。下面由学习啦小编为大家整理了linux中的sed命令的相关知识,希望对大家有帮助!linux中的sed命令详解Linux sed命令是利用script来处理文本文件。sed可依照script的指令,来处理、编辑文本文件。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。语法sed [-hnV][-e][-f][...

weixin_42488542的博客 1万+

文本三剑客之sed

sed 命令sed是一种文本流编辑工具,可以一行一行的处理文件内容。

2301_78791932的博客 2304

【Linux系列】sed命令的深入解析:如何使用sed删除文件内容

sed命令的名称来源于“stream editor”,即流编辑器,它能够处理来自标准输入的数据流,并将结果输出到标准输出。这意味着sed可以处理来自文件、管道或直接输入的文本数据。sed。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

linux用sed删除日志,linux中sed用法

一、sed命令介绍:1、含义:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。2、功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等3、参考:http://www.gnu.org/so...

weixin_32423063的博客 599

快速上手Linux文本流编辑器sed

两个文件,一个保存用户名,一个保存用户密码。用脚本一键创建文件中的用户并设置密码。

ZZZKKKRTSAE的博客 321

文本流编辑器 (sed、awk)

扩展正则表达式 扩展正则表达式是基础正则表达式的扩充深化 + 匹配前面子表达式1次及以上 ? 匹配前面子表达式0次或者1次 () 将括号中的字符串作为一个整体 | 以或的方式匹配字条串 练习示例: 过滤出字母g与d之间至少有1个字母o的行: [root@localhost ~]# egrep go+dtest.txt god good goood gooood root@olocalhost ~# awk /go+d/{print} test.txt god good g.

dilreba的博客 626
上一篇: 云栖大会:ZStack联手阿里云为用户带来无缝的混合云体验
下一篇: 如何实现Django规模化:寻找瓶颈
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值