【问题标题】:append new path in variable assignment in multiple scripts在多个脚本的变量赋值中追加新路径
【发布时间】:2019-02-02 15:24:46
【问题描述】:

我在 perl 脚本中声明了一个环境变量,如下所示。此变量在不同的 perl 文件中可能略有不同。 在第一个文件中:

$ENV{MY_LIBS} = "$MY_PATH/bin:$HOME/PACKAGE1:$HOME/PACKAGE2";

在第二个文件中:

$ENV{MY_LIBS} = "$MY_PATH/bin:$HOME/MYLIBS1:$HOME/PACKAGE2";

现在说我想将$MY_PATH/lib 附加到所有此类文件中,这样它们就会像:

在第一个文件中:

$ENV{MY_LIBS} = "$MY_PATH/bin:$HOME/PACKAGE1:$HOME/PACKAGE2:$MY_PATH/lib";

在第二个文件中:

$ENV{MY_LIBS} = "$MY_PATH/bin:$HOME/MYLIBS1:$HOME/PACKAGE2:$MY_PATH/lib";

如何在 Linux 中使用一些简单的命令来做到这一点?

【问题讨论】:

  • perl -i -pe 's|^(\$ENV{MY_LIBS} = "[^"]+)|$1:\$MY_PATH/lib|' *.pl

标签: linux perl unix


【解决方案1】:

您可以使用Perl "one-liner" 代替“Linux 中的简单命令

perl -i.bak -pe's/\$ENV{MY_LIBS}.*\K"\s*;/:$MY_PATH\/lib";/' file1 file2 ...

我假设$MY_PATH 代表文字字符串,否则我不知道它来自哪里。

开关的意思是:

  • -e 表示'' 中的内容被评估为 Perl 代码,因此程序如下

  • -p 打开给定文件并循环遍历行,以便'' 中的代码连续应用于每一行;处理后的行在末尾打印

  • -i 使其“就地”编辑输入文件(它们已更改)并使用.bak 保留备份

代码cmets:

lookbehind-type 构造 \K 丢弃所有以前的匹配项,因此不会从它之前的字符串中“消耗”任何内容;因此,替换部件会固定在所需的字符串上。我们确实需要放回";,因为它在\K 之后匹配,因此从字符串中删除(匹配时)。

【讨论】:

  • 感谢您的回答和解释很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多