【问题标题】:Perl output shell-escaped stringPerl 输出 shell 转义字符串
【发布时间】:2017-01-11 07:30:07
【问题描述】:

我正在尝试使用 perl one-liner 将 print0 输出转换为引用的 shell 参数,有点像 .. | xargs -0 printf "%q" {} 这样的技巧,但我不想要求 bash(其 printf 实现 %p )。我有点惊讶,嗯,找不到在 perl 中执行此操作的简单方法。对于 perl 的所有引用机制,我看不到 production 引用的字符串。当然,我只是看起来不够努力。

希望答案不是正则表达式。引用一个复杂的正则表达式放入 shell 命令行不是我的乐趣(如果只有一个简单的 perl 程序可以为我引用它,哦,回到同样的问题)。

【问题讨论】:

    标签: perl shell escaping quoting


    【解决方案1】:

    您可以相当简单地为类似 POSIX 的 shell 添加自己的引用 - 不需要复杂的正则表达式(只需使用文字进行简单的字符串替换):

    $ echo "I'm \$HOME. 3\" of rain." | perl -lne "s/'/'\\\''/g; print q{'} . \$_ . q{'}"
    'I'\''m $HOME. 3" of rain.'
    

    该方法仿照 AppleScript 的 quoted form of 命令:

    输入字符串被'分解成子字符串,每个子字符串本身是'-封闭的,带有原始的'字符。在子字符串之间拼接为\'(单独引用的')。

    当传递给 shell 时,shell 会将这些部分重新构建为单个文字字符串。

    这种多部分字符串连接方法是必要的,因为类似 POSIX 的 shell 绝对不允许将 ' 本身嵌入单引号字符串中(甚至没有转义序列)。


    或者,您可以安装 CPAN 模块,例如 ShellQuote


    可选的背景信息

    虽然 Perl 本身支持这种引用机制来将存储在单个字符串中的 shell 命令拼凑在一起传递给qx// (`...`) 会很方便,但是这种机制必须在 平台上运行- 特别是
    值得注意的是,Windows 的引用规则与 Unix 平台的规则有很大不同,除了简单的情况,shell 命令作为一个整体也是不兼容的。

    在 Perl 内部,您可以完全绕过引用的需要,通过使用 system()open()list 形式,您可以单独传递命令参数,原样,但请注意,如果您的命令不使用任何 shell 功能,这只是一个选项;对于“无壳”qx// (`...`) 替代方案,请参阅我的 this answer,它还涵盖了 Windows 上的 shell 引用。

    【讨论】:

    • s/// 不是正则表达式吗?好吧,您已经全部引用并逃脱了它,所以我真的不能抱怨。令人失望的是没有一个规范的简单方法来做同样的事情。
    • @smallduck:公平点; 技术上,我使用的是正则表达式,但概念上它是基于文字的简单字符串替换 - 我已经澄清了。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多