【发布时间】:2017-01-03 06:35:49
【问题描述】:
我想用用户输入生成的字符串替换目录下所有文件中的占位符。这个输入可以包含/ : . ~
我选择 Perl 来完成这项任务。
perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`
现在,~ 是 Perl 中的保留字符。我怎样才能在$user_input 中逃脱~? \~ 不起作用。
【问题讨论】:
-
我打算提出 this question 作为副本,但我只是不喜欢接受的答案。您实际上结合了两个常见(但很好!)的问题:1)如何将 shell 变量传递给 Perl?和 2)如何在正则表达式中转义特殊字符?我找不到同时解决这两个问题的合适问题,所以也许这可以成为一个新的规范问题。
-
您应该始终在 *nix 上将 Perl 单行语句用单引号括起来。意外地插入 shell 变量或触发历史命令太容易了(例如,
perl -e"s!foo!bar!"在 bash 中出现"bash: !foo!bar!": event not found错误)。您应该使用 Perl 的%ENV散列或将 bash 变量作为参数传递给 Perl 脚本。有几个不错的帖子,我会尽力为您找到它们。 -
我要赶紧指出,当
find定位包含空格的文件时,您的perl不会按照您的预期执行。 -
@DravSloan 这是真的。我通过我的目录的命名约定来解决这个问题——这适用于我的特殊用例。但为了给其他人留下可重用的解决方案,可接受的解决方案必须适用于名称中也包含空格的文件。
-
为什么不
find my_dir -type f -exec perl -i -pe 'commands' {} +?