这是在Windows 10上使用Git Bash提供的Linuxy环境。
我在目标源文件中有这一行:
'version' => 'v1.1.023',
我在~/.bash_profile
:
function tag() {
....
tagname="$1"
cmd="s:v[0-9]\\.[0-9]\\.[0-9]+:$tagname:g;"
perl -p -i -e "$cmd" config/app.php
...
}
当我运行命令时:
$ tag v.1.1.024
字符串未被替换,因此我的代码中的版本未更新。我用sed而不是perl尝试了一个非常相似的脚本。该文件未被更改。我在CentOS上尝试了相同的perl替换语法,但它确实有效。请注意,为了使命令在perl中运行时在下一行上工作,似乎需要双反斜杠。也就是说,命令的变量字符串表示具有双反斜杠,因此它变为文字“。”。在替换。
有什么想法吗?
答案 0 :(得分:2)
-i
不适用于perl
的Windows版本。
>perl -i -pe1 foo
Can't do inplace edit without backup.
该功能使用匿名文件,Windows不支持这些文件。也就是说,您没有使用perl
的Windows版本,而是使用cygwin版本或类似版本。可能是您的unix仿真环境模拟匿名文件,因此可能不是问题所在。
但如果是问题,将-i
替换为-i.bak
将解决问题。 (随意跟进rm config/app.php.bak
。)
顺便说一下,你正在生成易碎的Perl代码。 (包含:
,\
,$
或@
的代码名称将导致代码失败。)我推荐以下其中一项:
TAGNAME="$tagname" perl -i -pe's:v[0-9]\.[0-9]\.[0-9]+:$ENV{TAGNAME}:g' config/app.php
或
perl -i -pe'
BEGIN { $tagname = shift(@ARGV); }
s:v[0-9]\.[0-9]\.[0-9]+:$tagname:g;
' "$tagname" config/app.php
答案 1 :(得分:-1)
您好@phpguru我会关注KISS principle。
Using sed并避免使用perl
6.3。我什么时候应该使用sed?
当您需要一个小型,快速的程序来修改单词,行或块时 文本文件中的行。
function tag() {
tagname="$1"
sed -i -e "s:v[0-9]\.[0-9]\.[0-9]\+:$tagname:g" test.php
}
在我的环境中输出
m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~
$ cat .bash_profile
function tag() {
tagname="$1"
sed -i -e "s:v[0-9]\.[0-9]\.[0-9]\+:$tagname:g" test.php
}
m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~
$ cat test.php
'version' => 'v1.1.023,
m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~
$ tag v1.1.024
m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~
$ cat test.php
'version' => 'v1.1.024,