如何在git bash中编写动态字符串替换?

时间:2017-06-07 19:19:25

标签: linux git bash perl sed

这是在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中运行时在下一行上工作,似乎需要双反斜杠。也就是说,命令的变量字符串表示具有双反斜杠,因此它变为文字“。”。在替换。

有什么想法吗?

2 个答案:

答案 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,