【发布时间】:2021-12-15 17:08:14
【问题描述】:
我在使用简短的 bash 脚本时遇到了问题。似乎所有正斜杠都需要转义。如何在 perl 读取扩展(环境)变量中的必需字符之前对其进行转义?或者其他 perl 能理解的方法。
这是我正在尝试做的,但这将无法正常工作。
eval "perl -pi -e 's/$HOME\/_TV_rips\///g'" '*$videoID.info.json'
这是videoID=$1 的较长脚本的一部分。 (并且由于某种原因,perl 扩展了单引号和双引号内的变量。)
这个在扩展环境变量$USER 中没有正斜杠的简单解决方法有效。但我不想硬编码/Users/:
eval "perl -pi -e 's/\/Users\/$USER\/_TV_rips\///g'" '*$videoID.info.json'
这可能可以通过更好的方式来解决,获取文件或其他内容的主目录。目标是删除 youtube-dl 的 json 数据中的文件夹名称。 我使用 perl 只是因为它可以处理扩展的正则表达式。但是 perl 不是必需的。欢迎任何更好的 macOS 上扩展正则表达式的替代品。
【问题讨论】:
-
XY 问题是询问您尝试的解决方案,而不是您的实际问题。
-
并非如此。我正在描述我目前遇到的问题,并在最后一段中描述了我的总体目标。并且还说我也对其他方法持开放态度,但也很好奇 perl 出了什么问题并解决了这个问题 - 即使有另一个更好的解决方案我可能会受到 in 答案的启发。
-
我不明白你为什么要在这里使用 eval
-
您可以使用
s{...}{...}代替s/.../.../以避免转义/(因为它不再是语句中的分隔符。您也可以使用$ENV{HOME}来访问环境变量Perl 而不是使用 shell 中的那个。请注意,根据引用,您可能需要转义$。“由于某种原因,perl 会在单引号和双引号内扩展变量。” - Perl此处没有扩展任何内容,但 shell 会这样做,因为您在 perl 语句周围使用了双引号,即eval "....shell will expand things here ..." -
任何时候你在使用 eval 你可能做错了什么。您不需要使用 eval 将环境变量导入 Perl。它们已经存在,在
%ENV哈希中。如果你想在正则表达式中转义字符,你可以使用\Q来引用元字符。如果您添加一个简单的测试用例,这可能是一个非常简单的 Perl 任务。