【问题标题】:How do we replace PATH in all the files with an env variable我们如何用环境变量替换所有文件中的 PATH
【发布时间】:2023-04-10 03:25:02
【问题描述】:

我有大约 230 个文件,它们是 *.pl 、 *.txt 和一些 *.conf 文件,它们的默认路径设置为当前环境,例如 /home/AD/USR/perl/5.8.0/bin/perl。我需要将"/home/AD/USR" 替换为环境变量${USR_PATH}。我要修改的文件在子目录中。这意味着我的脚本应该找到 e.g find .|xargs grep -l "/home/AD/USR" 所有文件,然后替换字符串。

  • 旧:/home/AD/USR/perl/5.8.0/bin/perl

  • 新:${USR_PATH}/perl/5.8.0/bin/perl

有人可以告诉我该怎么做吗?

外壳:/bin/bash 环境:Linux x86_64

【问题讨论】:

    标签: perl shell


    【解决方案1】:

    如果您用${USR_PATH} 替换字符串的一部分,您将引用perl 变量$USR_PATH,而不是环境变量,在perl 中称为$ENV{USR_PATH}

    perl -pi.bak -we 's#/home/AD/USR(?=/perl/5.8.0/bin/perl)#\$ENV{USR_PATH}#g' 
        *.pl *.txt *.conf
    

    使用前瞻可以省去事后替换路径其余部分的麻烦。

    我假设您想用文字值替换它。如果要替换成环境变量中的实际值,只需去掉$ENV前面的反斜杠即可。

    虽然使用环境变量看起来很方便,但它会降低脚本的可移植性。为什么不使用配置文件?如果你从一开始就这样做,你就不会遇到这个麻烦。搜索 CPAN 寻找一个不错的模块。

    【讨论】:

    • 那么,如果$ENV{USR_PATH} = "/foo/bar",这是否意味着您希望结果为$ENV{USR_PATH}/perl/5.8.0/bin/perl/foo/bar/perl/5.8.0/bin/perl
    • 你使用 conf 是对的。但是情况毫无根据,我不得不找到解决方法。感谢您的快速帮助。
    • /foo/bar/perl/5.8.0/bin/perl 这是我所期待的。
    • @dicaprio 然后您需要删除反斜杠,如我的回答中所述。尽管请注意,硬编码另一条路径只会让您重复同样的问题。完整的解决方法是使用配置文件。
    • 一个问题,这会仅在当前目录中找到文件吗?
    【解决方案2】:

    perl -i -pe 's|/home/AD/USR/perl/5.8.0/bin/perl|\${USR_PATH}/perl/5.8.0/bin/perl|' <your files>

    【讨论】:

    • 我确实尝试过类似的方法。 perl -pi'*.bak' -e 's|^/home/AD/USR/|\${USR_PATH}|' find ./ -name '*.conf'``。不知道如何获得这项工作。我需要在子目录中搜索具有此路径的文件并替换。希望你明白了吗?
    • 您的脚本将找不到路径为 /home/AD/USR 的文件。
    • 那时我可能误解了这个问题。您是想将文件从一个路径移动到另一个路径,还是想替换一堆文本文件中的路径字符串?
    • 我正在尝试从具有路径 /home/AD/USR 的根目录中查找文件,并将路径替换为 env 变量。
    • 例如:查找 .|xargs grep -l "/home/AD/USR"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2021-12-27
    • 2011-07-13
    • 2021-08-01
    • 2018-09-09
    • 2016-06-05
    相关资源
    最近更新 更多