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


0

我的一些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-%'。Regexp替换为'CM-%regexp RET newstring RET'。我猜那对我来说是C-ESC-%?不幸的是,这也是KDE中“系统活动”监视器的捷径。

我现在有两个问题:

  1. 是否有另一种方式来调用regexp替换比C-ESC-%
  2. 对于上面的例子,“newstring”的表达应该是什么?

Answers:


1

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

  • 该字符$与“行尾”位置匹配,因此您需要在匹配文字时将其转义$。使用[$]而不是\$品味(如果你想将它转换为elisp,它会减少可能需要转义的反斜杠)。

  • 你不需要-在角色替代中反斜杠逃脱,事实上你不能; 包括反斜杠也匹配反斜杠。从手册

    由于'\'在字符替换中并不特殊,因此它永远不会删除' - '或']'的特殊含义。因此,当它们没有特殊含义时,你不应引用这些字符。这不会澄清任何事情,因为反斜杠可以合理地位于这些具有特殊含义的字符之前,如'[^ \]'(对于Lisp字符串语法为''“[^ \\]”'),它匹配任何单个字符,除了a反斜杠。

    但是-当在字符替代中使用时,它将匹配自己,只要它不能被解释为范围的一部分。为安全起见,先把它放在最后。

  • 我认为你不想匹配孤独$,所以你应该使用+而不是*。不过,可能不是太大的交易。

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

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

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

  • 您可以使用Emacs解释ESCC-[相同并使用的事实C-[ C-%

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

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


谢谢 - 太棒了!我找到了正则表达式搜索文档,但是你${\1}的替换却丢失了 - 正是我需要的。还要感谢改进正则表达式 - 我默认转义连字符,因为它用于范围(如'A-Z')所以:解释。非常强大的东西
alle_meije 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.