正则表达式搜索并替换 bash 变量

正则表达式搜索并替换 bash 变量

我的许多 bash 脚本在发送之前都需要整理一下。我想做的一件事就是对所有变量名使用花括号。因此,它所说的所有地方都$PWD应该改为${PWD}等。

作为测试我使用代码

PATH=${PWD}
PATH_PATH=$PATH
PATH_PATH_PATH=$PATH_PATH

我的想法是使用正则表达式搜索和替换emacs。找到我的所有变量名的最佳表达式(使用 CTRL-ALT-S)是$[A-Za-z0-9_\-]*,因此是“a”到“z”、“A”到“Z”、“0”到“9”的序列,下划线或连字符跟在“$”后面。此外,它不会改变已经用括号括起来的变量名。

现在替换:
手册上说替换是“M-% string RET newstring RET”。在我的计算机上,“M-%”是“ESC-%”。正则表达式替换为“CM-% regexp RET newstring RET”。我猜对我来说应该是 C-ESC-%?不幸的是,这也是 KDE 中“系统活动”监视器的快捷方式。

我现在还剩下两个问题:

  1. 除了 C-ESC-% 之外,还有其他方法可以调用正则表达式替换吗
  2. 对于上面的例子,“newstring”的表达式应该是什么?

答案1

我将使用正则表达式[$]\([a-zA-Z0-9_-]+\)和替换字符串${\1}。以下是我对正则表达式所做的更改的解释:

  • 字符$匹配“行尾”位置,因此在匹配文字时需要对其进行转义$。使用[$]而不是\$取决于个人喜好(如果要将其翻译为 elisp,它可以减少可能需要转义的反斜杠)。

  • 您不需要-在字符替代中使用反斜杠转义,实际上您不能;包括反斜杠也只会匹配反斜杠。从手册

    由于 '\' 在字符替代中不是特殊的,它永远不能删除 '-' 或 ']' 的特殊含义。因此,当这些字符没有特殊含义时,您也不应该引用它们。这不会澄清任何事情,因为反斜杠可以合法地放在这些字符前面,而它们特殊含义,如 '[^\]'(Lisp 字符串语法为 '"[^\\]"'),它匹配除反斜杠之外的任意单个字符。

    -如果在字符替代中使用,则只要它不能被解释为范围的一部分,它就会匹配自身。为了安全起见,请将其放在开头或结尾。

  • 我认为您不想匹配单独的$,因此您应该使用+而不是*。不过,这可能不是什么大问题。

  • 最后,您需要将变量名称包装起来,\( \)以便可以在替换字符串中引用它(作为\1)。

至于你的第二个问题,你有几个选择:

  • 最直接的选择是ESC C-%。请注意,这ESC不是修饰键,而是前缀键。

  • ESC您可以利用 Emacs 对和进行相同解释的事实C-[并使用C-[ C-%

  • 您可以通过名称调用该命令M-x query-replace-regexp

  • 或者您可以在个人配置中将命令绑定到更方便的键。

相关内容