【问题标题】:Search and replace with parameters搜索和替换参数
【发布时间】:2018-09-10 10:26:47
【问题描述】:

我有一个很长的 YAML 配置文件,我想更改它。 我想将属性“url”替换为 url 的字典,例如更改,

url: https://bla.bla

进入

url: {my_key: https://bla.bla}

所以基本上,对于在url 键之后找到的给定字符串“s”,我想将它包裹在{key: s}

有没有一种使用基本文本编辑器查找和替换功能的有效方法?顺便说一句,我正在使用 spacemacs

【问题讨论】:

  • 还有其他需要插入的键吗?如果不是,是什么决定了您使用{my_key: some_url} 而不是{key: some_other_url}

标签: search replace emacs


【解决方案1】:

你可以运行:Meta+x query-replace-regexp,对我来说映射到CTRL+Meta+% 在“常规” emacs 中。

当提示输入正则表达式时,您可以尝试:

.*url:[ ]*\(.*\)

或更严格的选项将删除前导和尾随空格:

^.*url:[ ]*\([^ ]+\)[ ]*$

然后点击 RETURN

当提示替换文本时,尝试:

{ my_key: \1 }

如果模式匹配,您只需点击 y 确认,或点击 ! 自动确认其余部分。首先备份您的数据。在正则表达式中,括号之间的模式被“捕获”(可以有多个捕获)。在替换中,\1 被替换为第一个捕获的模式。花一些时间学习正则表达式。它们非常强大。

【讨论】:

  • [ ] 是一种奇怪的空间表示方式;并且您贪婪的“任何东西”组将保证以下零个或多个空格实际上是零个空格,因此这显然不是您想要的。 (仅供参考 *?+?*+ 的非贪婪变体)。你也从文本中删除了url:
  • 这是我的本意。它旨在消耗行尾的任何空白,因此不会被捕获。我花了大约一分钟的时间来回答,请随时改进。
  • 行尾的任何空白都已被贪婪的\(.*\) 捕获。我强烈建议您尝试使用非贪婪运算符来了解它们是如何工作的。例如考虑\(.*?\) *$
猜你喜欢
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2019-05-05
  • 2011-02-20
  • 2012-12-25
相关资源
最近更新 更多