了解 Linux Sed 命令中的保持缓冲区

2023-10-12

保持缓冲区在sed允许您临时存储和检索输入行。

将其视为辅助存储器,您可以在使用主模式空间时放置数据。

当您需要一次执行涉及多行的操作时,保持缓冲区特别有用。

保留缓冲区不是立即处理和打印每一行,而是让您保存一行、处理其他行,然后在需要时返回保存的行。

 

 

模式空间和保持空间之间的区别

In sed,在处理输入时,您将主要处理两个主要缓冲区:模式空间和保持空间。

模式空间:这是默认的工作空间sed。每当sed从输入中读取一行,并将该行放入模式空间中。

在这里,所有编辑命令都作用于该空间的内容。处理完特定行的所有命令后,sed通常输出模式空间内容,然后清除它以在下一行输入中读取。


echo -e "apple\norange" | sed 's/apple/fruit/'
  

Output:


fruit
orange
  

在上面的命令中,sed在打印结果之前,在模式空间中将“apple”替换为“fruit”。

保持空间:保留空间用作临时存储,可以与模式空间结合使用。

虽然模式空间不断地被每行新的输入覆盖,但保留空间仍然保持不变,直到显式修改为止。

这允许您保存一行或任何数据,以便稍后在您的sed加工。


echo -e "apple\norange" | sed -n '1h; 2{g; p;}'
  

Output:


apple
  

在此示例中,第一行“apple”被复制到保留空间1h.

在第二行,2{g; p;}从保留空间获取内容并将其放入模式空间,然后打印它。

由于保留空间有“apple”,所以这就是打印的内容。

图案空间和存放空间都提供不同的功能。虽然模式空间允许立即处理,但保持空间非常适合跨多行保存数据。

 

将模式空间复制到保持缓冲区

The h命令输入sed将模式空间的内容复制到保持缓冲区中。

当您使用此命令时,此时模式空间中的任何内容都会存储在保持缓冲区中,替换以前保存在那里的任何内容。

让我们通过一个实际的例子来证明这一点:


echo -e "apple\norange\nbanana" | sed -n '1h; 2p; 3g; 3p'
  

Output:


orange
apple
  

以下是逐步发生的情况:

  1. 对于第一行“apple”,1h命令将其复制到保持缓冲区中。
  2. 对于第二行“orange”,2p命令打印它。
  3. 对于第三行“banana”,3g命令从保持缓冲区获取内容并将其放置在模式空间中。由于“apple”存储在保持缓冲区中,因此模式空间现在包含“apple”。
  4. 仍然在第三行,3p命令打印模式空间的当前内容,即“apple”。

 

将模式空间附加到保持缓冲区

The H命令输入sed允许您将模式空间的内容附加到保持缓冲区。

它不会替换保持缓冲区的现有内容。

相反,它将模式空间内容附加到保持缓冲区中已有的内容之后,并且这两部分数据由新行分隔。

下面是一个示例来阐明此操作:


echo -e "apple\norange" | sed -n '1h; 2H; 2g; 2p'
  

Output:


apple
orange
  

分解步骤:

  1. 第一行“apple”,1h命令将其复制到保持缓冲区。
  2. 在第二行“橙色”中,2H命令将此行附加到保持缓冲区。此时,保持缓冲区包含“apple\norange”。
  3. 仍然在第二行,2g命令从保持缓冲区获取全部内容并将其放置在模式空间中。
  4. 最后,2p命令打印模式空间的内容,结果是两行:“apple”和“orange”。

 

用保持缓冲区内容替换模式空间

The g命令输入sed用于将模式空间的内容替换为保持缓冲区中的内容。

当您希望从保持缓冲区检索以前存储的数据并在模式空间内对其进行操作时,这是一个方便的命令。

让我们深入研究一个例子:


echo -e "apple\norange" | sed -n '1h; 2g; 2p'
  

Output:


apple
  

了解流程:

  1. 第一行“apple”,1h命令将此内容移动到保持缓冲区中。
  2. 当处理第二行“orange”时,2g命令用保持缓冲区的内容(“apple”)替换模式空间的内容(“orange”)。
  3. 紧接着,2p命令打印模式空间的内容,现在是“apple”。

 

将保持缓冲区附加到模式空间

The G命令输入sed用于将保持缓冲区的内容附加到模式空间,并以换行符分隔。

让我们通过一个例子来理解这个概念:


echo -e "apple\norange" | sed -n '1h; 2G; 2p'
  

Output:


orange
apple
  

分步演练:

  1. 对于“苹果”系列,1h命令将其内容存入保持缓冲区。
  2. 当我们处理第二行“orange”时,2G命令将保留缓冲区的内容(即“apple”)附加到模式空间,确保它们由换行符分隔。然后模式空间保存“orange\napple”。
  3. 随后的2p命令打印模式空间的串联内容。

 

交换保持缓冲区和模式空间

The x命令输入sed用于交换模式空间和保持缓冲区的内容。

让我们深入研究一个例子:


echo -e "apple\norange" | sed -n '1h; 2x; 2p'
  

Output:


apple
  

发生的情况如下:

  1. 在“apple”这一行,我们使用1h命令将其内容存储到保持缓冲区中。
  2. 当我们到达第二行“橙色”时,2x命令将模式空间(“orange”)的内容与保持缓冲区(“apple”)的内容交换。交换后,模式空间包含“apple”,保持缓冲区包含“orange”。
  3. 交换之后,立即2p命令打印模式空间的当前内容,即“apple”。

 

保持缓冲区的用例

保持缓冲区在sed不仅仅是一个存储空间;它是一种为执行多行处理打开大门的机制。让我们探讨一下保持缓冲区的一些关键用例:

保存和检索多行处理的行

您可以存储一行(或多行),然后使用保存的数据对后续行应用操作。


echo -e "header\ncontent\nfooter" | sed -n '/header/h; /footer/{g; p;}'
  

Output:


header
  

在这种情况下,“标题”行被保存到保持缓冲区。当我们遇到“页脚”行时,我们检索“页眉”并打印它。

存储行之间的上下文或状态

有时,在处理后面的行时,您需要回忆上下文或特定状态。保持缓冲区可以充当存储器,让您可以参考先前的行以获取上下文。


echo -e "apple\norange\ninfo: banana" | sed -n '/apple/h; /info:/{x;G; s/info: //; p;}'
  

Output:


apple
banana
  
  • /apple/h:将包含“apple”的行复制到保持缓冲区。
  • /info:/:查找包含“info:”的行。
  • {x; ...}:对于这些行,交换保持缓冲区和模式空间,这会将“apple”放入模式空间并将“info:banana”放入保持缓冲区。
  • G:将保持缓冲区(现在包含“info:banana”)附加到模式空间。
  • s/info: //:删除“info:”前缀。
  • p:打印图案空间。

重新排列行或块的顺序

保持缓冲区的更高级用途之一是对文本行或文本块重新排序。

如果您需要根据条件或模式对数据序列进行打乱,则保持缓冲区将成为不可或缺的工具。


echo -e "line2\nline1" | sed -n '1h; 2{p; x; p;}'
  

Output:


line1
line2
  
  • 1h:在第一行(line2),将内容复制到保持缓冲区。
  • 2{p; x; p;}: On the second line:
    • p:打印当前模式空间(line1).
    • x:与保持缓冲区交换模式空间,这带来了line2进入模式空间。
    • p:打印现在包含的模式空间line2.

 

使用保持缓冲区进行多遍编辑

假设您有一个文本块需要一系列不同的转换。

试图在一次传递中实现这一点将是复杂且容易出错的。多遍编辑允许您:

  1. 将转换分解为孤立的步骤。
  2. 在进行下一个转换之前确保每个转换的准确性。
  3. 安全存储中间结果以供后续处理。

让我们深入研究一个我们想要的示例:

  1. 将水果列表转换为大写。
  2. 在每个水果前加上“FRUIT:”一词。

Command:


echo -e "apple\norange\nbanana" | sed -n -e '1,3{s/.*/\U&/;h}' -e '1,3{x;s/^/FRUIT: /;p}'
  

Output:


FRUIT: APPLE
FRUIT: ORANGE
FRUIT: BANANA
  

分解步骤:

First -e(前三行的第一遍):

1,3{s/.*/\U&/;h}:对于第1行到第3行,我们将整行转换为大写,然后将其存储在保持缓冲区中。

Second -e(前三行的第二遍):

1,3{x;s/^/FRUIT: /;p}:对于第 1 行到第 3 行,我们将保持缓冲区的内容与模式空间交换,并在该行前面添加“FRUIT:”前缀,然后打印它。

 

使用复杂脚本管理保持缓冲区

在处理复杂的脚本时,尤其是那些密集利用保持缓冲区的脚本时,有效管理保持缓冲区以防止意外结果并保持可读性至关重要。

必要时清除保持缓冲区

有时不再需要保留缓冲区的内容,为了防止意外使用它,您可能需要清除它。

要清除保持缓冲区:


s/.*//
h
  

这可以确保您从头开始,特别是在缓冲区的内容可能干扰后续操作的情况下。

使用保持缓冲区进行调试

调试一个sed脚本,尤其是涉及保持缓冲区的脚本,可能具有挑战性。一种方法是在战略点打印图案空间和保持缓冲区。

用这个:


# Print pattern space and hold buffer for debugging
l0
g
l0
  

这将提供两个缓冲区的清晰视图,帮助您跟踪脚本中的数据流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Linux Sed 命令中的保持缓冲区 的相关文章

  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg

随机推荐

  • 掌握Python的内置时间模块

    蟒蛇time模块提供了多种方式代表时间代码中 例如对象 数字和字符串 它还提供除表示时间之外的功能 例如在代码执行期间等待和测量代码的效率 本课程将引导您了解最常用的函数和对象time 完成本课程后 您将能够 理解处理日期和时间的核心概念
  • 关于奥尔德伦·桑托斯

    关于奥尔德伦 桑托斯 个人网站 大家好 我是 Aldren Santos 担任自由平面设计师 插画师已有 3 年了 我的任务是尽我所能 让这个网站变得更加精彩 我真心希望我的插图能够吸引您通过我们团队辛勤工作的这些教程学习 Python 的
  • 编写和测试 Python 函数:面试练习(概述)

    无论您是想在编码面试中取得好成绩 还是只是想提高您的开发技能 解决编码挑战可以帮助您成长为一名程序员 在这个真实的 Python 代码对话中 Philipp 向 Martin 提出挑战 要求他编写一个函数 将字符串中的每个字符加倍 通过他们
  • 引导 Django 项目

    有关本课程所涵盖概念的更多信息 您可以查看 如何设置 Django 项目 真正的Python文章 使用 Django 和 Python 构建个人日记 真正的Python文章 以下是本课程中使用的命令行片段 mkdir portfolio p
  • Python 石头剪刀布:命令行游戏(概述)

    游戏编程是学习如何编程的好方法 您可以使用许多在现实世界中看到的工具 此外您还可以玩游戏来测试您的结果 开始 Python 游戏编程之旅的理想游戏是剪刀石头布 在本课程中 您将学习如何 自己编写代码剪刀石头布游戏 接受用户输入input 使
  • 2021 年 4 月 21 日

    主持人大卫 阿莫斯回答会员的问题 在这次会议上 我们讨论了 Real Python 的新功能 在哪里可以找到要阅读的代码以提高您的 Python 技能 为什么 0xfor x in 1 2 3 回报 15 数据科学 Django 和 Fla
  • Python 中的 K 均值聚类:实用指南

    目录 What Is Clustering 聚类技术概述 分区聚类 层次聚类 基于密度的聚类 How to Perform K Means Clustering in Python 了解 K 均值算法 使用 Python 编写您的第一个 K
  • 在 Python 中使用 lru_cache 进行缓存

    有很多方法可以实现快速响应的应用程序 缓存是一种方法 如果使用得当 可以使事情变得更快 同时减少计算资源的负载 蟒蛇的功能工具模块附带 lru cache 装饰器 这使您能够使用以下命令缓存函数的结果最近最少使用 LRU 策略 这是一种简单
  • 拼写错误、缺失或误用 Python 关键字

    以下是有关 Python 关键字的更多信息的资源 Python 关键字 简介 真正的 Python 文章 Python 3 8 关键字 Python 文档
  • Python 标准 REPL:快速尝试代码和想法

    目录 Getting to Know the Python Standard REPL 什么是 Python 的交互式 Shell 或 REPL 为什么使用 Python REPL Starting and Ending REPL Inte
  • 使用 Fabric 和 Ansible 自动化 Django 部署

    目录 设置和配置 Fabric Setup 设置 SSH 密钥 强化用户密码 安装 Ansible 依赖项 将 SELinux 设置为宽容模式 升级服务器 完整性检查 Ansible Primer 剧本 示例手册 Playbook Setu
  • 第 27 集:准备面试 Python 练习题

    第 27 集 准备面试 Python 练习题 真正的 Python 播客 2020 年 9 月 18 日47m RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君子 灰蒙蒙 袖珍铸件 投
  • Python 基础知识:函数和循环(摘要)

    在本视频课程中 您了解了两个最基本的概念 在编程中 函数和循环 首先 您学习了如何定义自己的自定义函数 你看到了 该函数由两部分组成 这函数签名 这开始于def关键字并包括函数名称和函数参数 这函数体 其中包含每当调用该函数时运行的代码 函
  • Python 的 urllib.request 用于 HTTP 请求

    目录 使用 urllib request 的基本 HTTP GET 请求 The Nuts and Bolts of HTTP Messages 了解什么是 HTTP 消息 了解 urllib request 如何表示 HTTP 消息 关闭
  • Django Ninja 的隐蔽 REST API(摘要)

    在本课程中 您已经了解了 Django Ninja REST API 库的所有内容 使用 Ninja 您可以 使用装饰器快速包装 Django 视图创建 REST API 端点 使用类型注释定义变量和参数 写Schema和ModelSche
  • Python 中的 Dijkstra 算法(查找最短路径)

    Dijkstra算法的工作原理是通过迭代找到节点的最短距离值 直到达到实际的最短距离 Dijkstra 算法的一个关键方面是它使用优先队列从尚未处理的节点集中选择具有最小暂定距离的顶点 当前节点被标记为已访问 并检查其所有邻居节点是否有更优
  • 使用 Pandas read_excel 读取 Excel 文件

    Pandas read excel是一个函数蟒蛇熊猫库允许我们在 Python 中读取 Excel 文件并将其转换为数据框 object read excel函数可以导入具有不同扩展名的Excel文件 例如 xls xlsx xlsm和 o
  • Pandas where() 方法:带条件过滤

    The where中的方法Pandas允许您根据条件过滤 DataFrame 或 Series 类似于 SQL 的 WHERE 子句 您是否曾经发现自己需要根据特定条件替换 DataFrame 中的某些值 或者可能想要屏蔽不符合某些条件的数
  • Linux find 命令:综合指南

    The findLinux 中的命令是一个功能强大的实用程序 用于根据您指定的条件搜索和定位文件和目录 它可以按名称 大小 类型 权限 日期和许多其他标准快速定位文件 目录 hide 1 基本语法 2 Finding Files by Na
  • 了解 Linux Sed 命令中的保持缓冲区

    保持缓冲区在sed允许您临时存储和检索输入行 将其视为辅助存储器 您可以在使用主模式空间时放置数据 当您需要一次执行涉及多行的操作时 保持缓冲区特别有用 保留缓冲区不是立即处理和打印每一行 而是让您保存一行 处理其他行 然后在需要时返回保存