从命令行查找并替换多行文本

2024-04-04

我正在尝试使用还执行其他操作的脚本编辑配置文件。

该脚本需要找到某些连续的文本行并将其删除。 它需要在适当的位置粘贴一个新配置,该新配置从旧配置所在的同一行开始。在新旧配置中,空间的使用都很重要。

在 configfile.php 中,此文本块:

  'session' => 
  array (
    'save' => 'files',
  ),

需要找到并替换为我在同一位置放入 replacement.txt 中的内容。

根据类似问题的答案,我尝试过的事情之一是:

cat replacement.txt <(sed -i '1,/  'session' => \n  array (\n    'save' => 'files',\n  ),/d' configfile.php) > configfile.php

这会产生一个空文件。

cat replacement.txt <(sed -i '1,/  'session' => \n  array (\n    'save' => 'files',\n  ),/d' configfile.php) > newfile.php

这与 cat replacement.txt > newfile.php 的作用相同,我想编辑文件,而不是创建新文件。

有谁知道我的语法有什么问题以及如何修复它?

我以前问过这个问题here https://stackoverflow.com/questions/43839462/php-env-php-edit-from-bash-script-using-sed-awk-or-another-tool,但我并没有完全理解自己想要什么,所以它变得有点过于复杂和混乱。我使用 Debian Linux。

Edit根据评论:

replacement.txt 如下所示:

  'session' =>
     array (
     'save' => 'redis',
     'redis' =>
        array (
          'host' => '127.0.0.1',
          'other_variable' => 'other_setting',
        )
     )
  ),

它已经按应有的方式缩进并且可以按原样插入。 使用 awk 或 sed 都可以。


使用用于多字符 RS 的 GNU awk:

$ cat tst.awk
BEGIN { RS="^$"; ORS="" }
ARGIND==1 { old = $0 }
ARGIND==2 { new = $0 }
ARGIND==3 {
    if ( start = index($0,old) ) {
        $0 = substr($0,1,start-1) new substr($0,start+length(old))
    }
    print
}

$ awk -f tst.awk target.txt replacement.txt configfile.php
  foo
  'session' =>
     array (
     'save' => 'redis',
     'redis' =>
        array (
          'host' => '127.0.0.1',
          'other_variable' => 'other_setting',
        )
     )
  ),
  bar

以上是在这些输入文件上运行的:

$ cat  target.txt
  'session' =>
  array (
    'save' => 'files',
  ),
$
$ cat replacement.txt
  'session' =>
     array (
     'save' => 'redis',
     'redis' =>
        array (
          'host' => '127.0.0.1',
          'other_variable' => 'other_setting',
        )
     )
  ),
$
$ cat configfile.php
  foo
  'session' =>
  array (
    'save' => 'files',
  ),
  bar
$

对于其他 awk 来说,它是:

$ cat tst.awk
FNR==1 { ++argind }
argind==1 { old = (FNR>1 ? old RS : "") $0 }
argind==2 { new = (FNR>1 ? new RS : "") $0 }
argind==3 { rec = (FNR>1 ? rec RS : "") $0 }
END {
    if ( start = index(rec,old) ) {
        rec = substr(rec,1,start-1) new substr(rec,start+length(old))
    }
    print rec
}

$ awk -f tst.awk target.txt replacement.txt configfile.php
  foo
  'session' =>
     array (
     'save' => 'redis',
     'redis' =>
        array (
          'host' => '127.0.0.1',
          'other_variable' => 'other_setting',
        )
     )
  ),
  bar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从命令行查找并替换多行文本 的相关文章

  • Python3 http.server:将日志保存到文件中

    我使用Python3 6编写了一个简单的HTTP服务器来重定向所有请求 我写的文件可以找到here https github com kmahyyg learn py3 blob master antiscanhttp py 我可以在 Ub
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 未找到命令“ember”

    看来我搞砸了 ember cli 安装 我已经使用 sudo 安装了 npm 但是在阅读了 npm 上 ember cli 和 sudo 的一些问题后 我按照此处的说明卸载并重新安装https gist github com isaacs
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 如何让“grep -zoP”单独显示每个匹配项?

    我有一个此表格的文件 X this is the first match blabla X this is the second match and here we have some fluff 我想提取 X 之后和相同标记之间出现的所有
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • 为什么我不能将 sed 的输出重定向到文件

    我正在尝试运行以下命令 someprogram tee dev tty sed s 2 gt output file 但当我去查看时 该文件始终是空白的 如果我删除 gt output file从命令末尾 我可以看到 sed 的输出 没有任
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • awk: hping: 打印 icmp 发起/接收之间的差异

    我有以下输出hping http ports su net hping在 OpenBSD 上 hping icmp ts www openbsd org HPING www openbsd org re0 129 128 5 194 icm
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 迭代 bash 脚本中的变量名称

    我需要在一堆文件上运行一个脚本 这些文件的路径被分配给train1 train2 train20 我想 为什么不使用 bash 脚本使其自动执行呢 所以我做了类似的事情 train1 path to first file train2 pa
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t

随机推荐

  • 以程序方式生成二维“斑点”图形的好方法

    我希望以计算快速的方式创建一个 blob 这里的斑点被定义为可以是任何形状但全部相连的像素的集合 例子 ooo oooo oo oooooo o o ooooooooooooooooooo oooo oo ooooooo o oo oooo
  • 以编程方式检测图像是否有边框(返回布尔值)

    首先 我读过这篇文章 如何以编程方式检测图像边框 https stackoverflow com questions 1954742 how to detect an image border programmatically不过 他似乎在
  • Maximo 7.6 / SQL Server 2014 中文或泰文字符

    我工作的公司正在从带有 Oracle 10g 的 Maximo 7 1 升级到带有 SQL Server 2014 的 Maximo 7 6 该程序允许 7 1 和 Oracle 10g 中的中文和泰语字符通过前端 没有任何问题 但带有 S
  • Flutter 如何使AppBar条子标题垂直居中?

    我试图将 Sliver AppBar 的标题居中 并在其下方添加第二个文本 我做不到 下面是现在的图像以及它应该的样子 谁能帮我 这是我的代码 import package flutter material dart void main g
  • 如何在android中设置文本方向

    我有一个文本视图 我在其中设置了波斯语 阿拉伯语文本并将重力设置为右侧 但它在平板电脑中显示左侧的文本 如果设置左侧的重力则显示右侧 我该怎么做 直到它正常工作
  • 显示网络流量

    是否可以查看类似于以下内容的网络流量 http 请求 原始 http 等 chrome dev tools network tab 由应用程序生成 nodejs如果有什么区别的话 通过vscode 此功能已经存在 但它不显示正在运行的应用程
  • 在 CentOS 上安装 M2Crypto

    我正在尝试通过从源代码编译来在 CentOS 上安装 M2Crypto 我正在做一个 python setup py 构建 但我收到以下错误 usr local lib python2 6 distutils dist py 266 Use
  • 在 Swift 中将对象写入 CSV 时如何处理逗号?

    关于堆栈溢出似乎还有其他答案 但没有任何特定于 swift 的答案 我正在从包含 3 个属性的站点对象生成 CSV Struct SiteDetails var siteName String var siteType String var
  • 用于谷歌存储的静态网站的 Terraform 谷歌存储桶 - 403

    尝试为静态网站创建一个谷歌存储桶 provider google project myprojectname 123 credentials file storage admin json region us central1 zone u
  • 造成这种性能下降的原因是什么?如何调查它?

    Context 我正在使用 NEON SIMD 指令为 ARM64 编写一些高性能代码 我正在尝试进一步优化 我只使用整数运算 不使用浮点数 此代码完全受 CPU 或内存限制 它不执行任何类型的系统调用或 I O 文件系统 网络或其他任何内
  • LINQ to Entities 无法识别方法“System.Web.Mvc.FileResult”

    我试图用他们的图像显示多个用户名所以 我有一个像这样的 Json 操作方法 public JsonResult GetUsers var ret from user in db Users orderby user UserName sel
  • 每次 RxSwift 中 UITextField 文本属性更改时如何获取信号

    如何从以编程方式对 UITextField 文本属性进行的更改中获取信号 通过使用 rx text 仅当用户通过键盘输入文本时报告信号 如果您以编程方式设置 textField text 则信号不会触发 这就是我使用 rx text 的方式
  • 如何将 3D 点云导出为渲染的体素网格?

    我有一个由几个彩色体素组成的场景 当在 meshlab 中打开它时 所有点都被绘制为二维正方形 是否可以在网格实验室中渲染一个场景 其中正方形被 3D 立方体替换 并具有额外的闪电 反射率 这是我到目前为止得到的 我宁愿想要这样的东西 我为
  • 使用 protobuf 作为文本配置文件

    我最近遇到一个非常大的关键任务项目 其中所有配置 文件是使用文本 protobuf 定义来定义的 配置文件的意思是 人类可读和可编辑 例如 message ServerSettings required int32 port 3022 op
  • Coldfusion 中的字符串“00”等于“.0”?还有什么?

    所以我注意到 ColdFusion 回来了true对于条件 00 0 这可以在 CF 9 1 和 CF 10 中重现 我可以通过添加一个轻松解决这个问题find foo 条件 但这不正常 这样的事情让我对 ColdFusion 产生了怀疑
  • 使用 itextsharp 勾选 pdf 复选框

    我尝试了很多不同的方法 但我无法选中该复选框 这是我尝试过的 var reader new iTextSharp text pdf PdfReader originalFormLocation using var stamper new i
  • 在 mysql 中导出和导入 utf8 数据:最佳实践

    我们经常需要将数据文件发送给我们的一位客户 其中包含他 她需要翻译的数据库中的数据 大多数情况下 此导出为 CSV 或 XLS 大多数时候 我们使用 phpmyadmin 创建 csv 转储 并获得包含翻译数据的 xls 文件 问题是 大多
  • 在 r2017b 中使用 C++ 中的 startMATLAB 和“MatlabEngine.hpp”发出问题

    在新版本 2017b 中 Matlab 发布了新的 C MATLAB 引擎 API https fr mathworks com help matlab calling matlab engine from cpp programs htm
  • $(form).ajaxSubmit 不是函数

    我正在尝试使用 jquery 验证插件来验证表单并使用 ajax 请求提交内容 这段代码位于我的文档的头部 document ready function contact form validate submitHandler functi
  • 从命令行查找并替换多行文本

    我正在尝试使用还执行其他操作的脚本编辑配置文件 该脚本需要找到某些连续的文本行并将其删除 它需要在适当的位置粘贴一个新配置 该新配置从旧配置所在的同一行开始 在新旧配置中 空间的使用都很重要 在 configfile php 中 此文本块