如何在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
相关产品推荐
相关产品推荐

