交换两条线

2023-12-27

我怎样才能使用 sedH, h, x, g, G等命令交换两行?

例如在文件中

START
this is a dog
this is a cat
this is something else
END

假设我想用“这是别的东西”交换“这是一只狗”。

这是我到目前为止所拥有的:

/this is a dog/{
 h # put to hold space 
}
/this is something else/{
 # now i am stuck on what to do.
}

如果您知道要交换的两行中每一行的模式,但不知道行的完整内容,则可以执行以下操作:

sed -n '                     # turn off default printing
    /dog/{                   # if the line matches "dog"
           h                 # put it in hold space
           :a                # label "a" - the top of a loop
           n                 # fetch the next line
           /something/{      # if it matches "something"
                       p     # print it
                       x     # swap hold and pattern space
                       bb    # branch out of the loop to label "b"
           }                 # done with "something"
                             # if we're here, the line doesn't match "something"
           H                 # append pattern space to hold space
           x                 # swap hold and pattern space
           s/\([^\n]*\)\n\([^\n]*\)$/\2\n\1/    # see below
           x                 # swap hold and pattern space
           ba                # branch to the top of the loop to label "a"
    }                        # done with "dog"
    :b                       # label "b" - outside the loop
                             # print lines that don't match and are outside the pair
    p                        # also prints what had been accumulating in hold space
    ' inputfile

替换模式将“dog”保留在累积行的末尾。它不断交换我们保留在保留空间中的最后两行,以便“狗”“冒泡”到底部。

例如,让我们在“cat”行之后再添加一行,这样该过程就更清晰一些。我们将忽略“dog”之前和“something”之后的行。我将继续使用我的昵称来引用这些台词

this is a dog
this is a cat
there's a bear here, too
this is something else

读取“Dog”,然后获取“cat”。完成了一些附加和交换。现在模式空间看起来像这样(\N代表换行符,我使用大写的“AND”,因此它很突出,^是模式空间的开始并且$是结束):

^this is a dog\Nthis is a cat$

替换命令查找位于行末尾 ($) 的任意数量的非换行符(并捕获它们),后跟换行符,后跟任意数量的非换行符(并捕获它们),并替换所有这些都是以相反的顺序捕获的两个字符串,并用换行符分隔。现在模式空间看起来像这样:

^this is a cat\Nthis is a dog$

现在我们交换并读取一个新行。它不是“某物”,所以我们做了一些附加和交换,现在我们有了:

^this is a cat\Nthis is a dog\Nthere's a bear here, too$

我们再次进行替换,得到:

^this is a cat\Nthere's a bear here, too\Nthis is a dog$

为什么我们没有得到“熊/狗/猫”呢?因为由两行组成的正则表达式模式(每行通常由非换行符和后跟换行符组成)使用以下命令锚定在行的末尾:$所以我们忽略它之前的任何内容。请注意,最后一个换行符是隐含的,实际上并不存在于模式或保留空间中。这就是为什么我不在这里展示它。

现在我们读取“something”并打印它。我们交换。嘿!我们一直在“冒泡”这些东西。分支并打印。由于“dog”位于行的底部(已累积在保留空间中),并且我们在该行之前打印了“某物”,因此效果是我们交换了两行。

无论要交换的两行之前、之间或之后出现多少行,该脚本都将起作用。事实上,如果有多对匹配行,则每对的成员将在整个文件中交换。

正如您所看到的,我只在感兴趣的行中键入一个单词,但任何合适的正则表达式都可以。

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

交换两条线 的相关文章

随机推荐

  • get/set 已被弃用,取而代之的是 config 命令

    在命令行中使用 angular cli 我执行了 ng set defaults styleExt styl 将默认样式设置为 Stylus 我得到了以下响应 get set 已被弃用 取而代之的是 config 命令 我想更改现有项目的样
  • Prolog递归过程解释

    如果可能的话 我希望有人解释这个过程 来自 立即学习序言 一书 它需要两个数字并将它们加在一起 add 0 Y Y add s X Y s Z add X Y Z 原则上我明白 但我有一些问题 假设我发出查询 add s s 0 s 0 R
  • 寻找一种有效的方法或算法来检查文件是否属于某个文件夹路径列表中的某个项目

    我有一个文件夹路径列表 此列表中可能有许多 数十个甚至数百个文件夹路径 例如 C Program Files 7 Zip many directories under C Program Files C ProgramData Adobe
  • 通过 microsoft webtest 上传文件

    我有一个 webtest 我打算用它来加载测试将文件上传到网站 我正在使用 Visual Studio 中内置的 WebTest 框架 目的是从 Azure 运行更大规模的测试 我创建了一个新的网络测试并记录了步骤 包括文件上传 这一切都记
  • 在哪里可以找到特定 Git 提交的快照?

    我了解到 Git 为每次提交保留一个快照 快照本质上是copies of changed文件和一些references to unchanged files 所有Git相关数据都存储在 git存储库目录内的目录 duong2179 mbpr
  • weakhashmap是如何工作的? [复制]

    这个问题在这里已经有答案了 就像weakhashmap如何理解对其键之一的引用现在已经过时一样 尤其是如果键是池化的字符串的话 您不能将字符串文字与 WeakHashMap 一起使用 当然可以 但这样做没有意义 String myKey s
  • 如何在 Swift 中的泛型扩展中使用带有可选类方法的协议?

    我正在尝试使用类方法对现有类进行扩展 例如 objc public protocol MyProtocol optional class func foo gt Int 我在扩展中使用这个协议 通用如下 extension MyClass
  • 如果会话超时,MVC 中的 jquery ajax 调用后如何重定向到新页面?

    1 我有一个调用操作的Ajax链接 该操作返回一个视图 该视图在特定的Div中打开 将其视为使用相应视图更新div的菜单 2 如果会话超时 则返回我的登录视图 因此 如果我单击链接并且会话超时 登录视图将在 div 中打开 而不是在整个页面
  • 每天执行一次查询

    基本上我有一个MySQL数据库 其中有一个表存储我网站用户的请求 我想自动执行一个查询 删除所有已完成的请求 已完成意味着该列Status 3 根据该列 超过 180 天ArchivingDate My Requests table Req
  • 六个月内保留的参与者百分比

    我是一名学校老师 对 MS SQL Server 非常陌生 每个人都建议尝试一下这个网站 开始 我正在尝试编写查询来测试参与学术项目的不同类型的结果衡量标准 我想尝试几种不同的方法来计算这个结果测量 我试图计算的结果是 在该计划的六个月内保
  • 如何在不同的计算机上克隆 RStudio 环境

    我最近一直在加快使用 R 的速度 并且想知道最有效的方法是将 RStudio 环境 尤其是软件包安装 从一台计算机克隆到另一台计算机 我希望能够从台式机切换到笔记本电脑 但我在工作时经常向台式机添加软件包 并且希望有一种简单的方法来确保在笔
  • Python 中的持久记忆

    我有一个昂贵的函数 它接受并返回少量数据 一些整数和浮点数 我已经memoized http en wikipedia org wiki Memoization这个功能 但我想让备忘录持久化 已经有几个与此相关的线程 但我不确定某些建议方法
  • avformat_open_input 返回值,NaCl 模块上的错误代码

    我正在尝试将 FFmpeg 移植到我的 NaCl 模块中 到目前为止 我的模块链接了 ffmpeg 和 SDL 库 它已经可以播放 YUV 格式的视频 该视频被直接加载到内存中并复制到 YUVOverlay 缓冲区中 这非常简单 现在 我想
  • Excel 转 PDF 无需 Office

    我需要在我正在开发的 Windows 应用程序中生成 PDF 报告 我通过将 xlsx 文件导出为 pdf 来完成此操作 不过 我目前正在为此使用互操作 我需要在不要求用户购买软件的情况下执行此操作 因此不需要 Microsoft Offi
  • 分配大(32mb)连续区域

    是否有可能在运行时从内核代码分配大的 即 32mb 物理连续的内存区域 即不使用 bootmem 从我的实验来看 无论我使用什么 GFP 标志 似乎都不可能成功获得超过 4mb 的块 根据我读过的文档 GFP NOFAIL 应该让 kmal
  • iOS 模拟器游戏运行速度非常慢(低 fps)

    深入研究 sprite 套件 xcode 5 我正在使用两个示例程序 1 创建新项目时包含的默认宇宙飞船示例 2 我下载的冒险游戏 在 iOS 模拟器中运行这些示例 似乎哪个并不重要 每个的帧速率绝对是糟糕的 如果我在太空船 hello w
  • 以相同的 C# 形式从 web 浏览器链接到 ScintillaNET 编辑器?

    我是 ScintillaNET 的新手 我以相同的形式使用 webbrowser 和 scintillaNET 编辑器组件 我的任务是当我单击网络浏览器中的链接时 它应该链接到编辑器中的文本 任何帮助和建议将不胜感激 提前致谢 None
  • Azure ARM 模板和 REST API

    我正在尝试学习 Azure 资源模板 并尝试了解何时使用它们以及何时使用 REST API 背后的工作流程 我的感觉是 在 Azure 中创建虚拟网络和子网是相当罕见的情况 一旦您按照需要进行设置 就不会过于频繁地修改它 而是将内容部署到该
  • jQuery 中的弹出窗口

    我需要一个带有单选按钮选项的弹出窗口 我已经测试过Impromtu http en wikipedia org wiki Impromptu 28programming environment 29 有没有简单的 Popupwindow 插
  • 交换两条线

    我怎样才能使用 sedH h x g G等命令交换两行 例如在文件中 START this is a dog this is a cat this is something else END 假设我想用 这是别的东西 交换 这是一只狗 这是