我的许多 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 中“系统活动”监视器的快捷方式。
我现在还剩下两个问题:
- 除了 C-ESC-% 之外,还有其他方法可以调用正则表达式替换吗
- 对于上面的例子,“newstring”的表达式应该是什么?
答案1
我将使用正则表达式[$]\([a-zA-Z0-9_-]+\)
和替换字符串${\1}
。以下是我对正则表达式所做的更改的解释:
字符
$
匹配“行尾”位置,因此在匹配文字时需要对其进行转义$
。使用[$]
而不是\$
取决于个人喜好(如果要将其翻译为 elisp,它可以减少可能需要转义的反斜杠)。您不需要
-
在字符替代中使用反斜杠转义,实际上您不能;包括反斜杠也只会匹配反斜杠。从手册:由于 '\' 在字符替代中不是特殊的,它永远不能删除 '-' 或 ']' 的特殊含义。因此,当这些字符没有特殊含义时,您也不应该引用它们。这不会澄清任何事情,因为反斜杠可以合法地放在这些字符前面,而它们有特殊含义,如 '[^\]'(Lisp 字符串语法为 '"[^\\]"'),它匹配除反斜杠之外的任意单个字符。
但
-
如果在字符替代中使用,则只要它不能被解释为范围的一部分,它就会匹配自身。为了安全起见,请将其放在开头或结尾。我认为您不想匹配单独的
$
,因此您应该使用+
而不是*
。不过,这可能不是什么大问题。最后,您需要将变量名称包装起来,
\(
\)
以便可以在替换字符串中引用它(作为\1
)。
至于你的第二个问题,你有几个选择:
最直接的选择是
ESC C-%
。请注意,这ESC
不是修饰键,而是前缀键。ESC
您可以利用 Emacs 对和进行相同解释的事实C-[
并使用C-[ C-%
。您可以通过名称调用该命令
M-x query-replace-regexp
。或者您可以在个人配置中将命令绑定到更方便的键。