You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中用Perl将Shell变量替换到文件代码块?

问题解决:Shell变量无法在Perl替换命令中生效

核心原因

用单引号包裹Perl命令时,Shell不会解析单引号内部的变量$t,Perl会把$t当作自身变量而非Shell变量,自然无法替换成当前路径。

解决方案1:将Perl命令的单引号改为双引号

修改update.sh中的Perl命令,把单引号换成双引号,让Shell先解析变量$t:

#!/bin/sh

t=$(pwd)
echo $t
# 注意:原正则中的````shell\n`要改成````\n`,因为你的a.md代码块未指定shell语言
perl -i -p0e "s/(?<=```\n)[\s\S]*(?=\n```)/$t/s" a.md

解决方案2:通过Perl环境变量传递(更安全,适配含特殊字符的路径)

如果路径包含&、*这类Shell特殊字符,用双引号可能引发问题,推荐通过Perl环境变量传递:

#!/bin/sh

t=$(pwd)
echo $t
# 用ENV获取Shell传递的环境变量
perl -i -p0e 's/(?<=```\n)[\s\S]*(?=\n```)/$ENV{t}/s' a.md

或者直接在Perl命令前临时设置环境变量:

#!/bin/sh

echo $(pwd)
t=$(pwd) perl -i -p0e 's/(?<=```\n)[\s\S]*(?=\n```)/$ENV{t}/s' a.md

额外修正:正则匹配规则

原正则中的(?<=```shell\n)不符合你的a.md内容,因为代码块开头是纯````(无shell标记),必须改成(?<=```\n)才能正确匹配代码块内的内容。

内容的提问来源于stack exchange,提问作者dannyxnda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:25:34