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

Linux 如何在git bash中编写动态字符串替换?,linux,git,bash,perl,sed,Linux,Git,Bash,Perl,Sed,这是在Windows10上使用GitBash提供的Linuxy环境实现的 我的目标源文件中有以下行: 'version' => 'v1.1.023', 我的~/.bash\u配置文件中有此函数: function tag() { .... tagname="$1" cmd="s:v[0-9]\\.[0-9]\\.[0-9]+:$tagname:g;" perl -p -i -e "$cmd" config/app.php ... } 当我运行命令

这是在Windows10上使用GitBash提供的Linuxy环境实现的

我的目标源文件中有以下行:

'version' => 'v1.1.023',
我的
~/.bash\u配置文件中有此函数:

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


有什么想法吗

-i
不适用于
perl
的Windows版本

>perl-i-pe1foo
没有备份,无法进行就地编辑。
该功能使用Windows不支持的匿名文件。也就是说,您使用的不是Windows版本的
perl
,而是cygwin版本或类似版本。您的unix仿真环境可能会模拟匿名文件,因此这可能不是问题所在

但如果是问题,用
-i.bak
替换
-i
将解决问题。(请随时使用
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


嗨@phpguru我会跟着你

并避免使用perl

6.3。我应该什么时候使用sed

当您需要一个小的、快速的程序来修改单词、行或块时 文本文件中的行数

我的环境中的输出:

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,

Re“请注意,双反斜杠似乎是必需的”,不应如此
printf'%s\n%s\n'\.''\.''\.'\.'
显示
'\.'
'\.'
在功能上是相同的。请提供一个最小的、可运行的问题演示OP正在使用一个用MinGW gcc:
C:\>“\Program Files\git\usr\bin\perl.exe”-v
构建的
perl 5,版本22,subversion 1(v5.22.1)为x86_64-msys-thread-multi
@SinanÜnür构建,为什么你要告诉我?这样我就可以用它来测试
-I
?我不知道这对我有什么帮助。你为什么不这样做?我两个都试过了,对我都不起作用。即使目标文件没有变化,也会生成一个.bak文件,我在下一行使用rm。Re“即使目标文件未更改,也会生成.bak文件",这意味着模式不匹配。哦,好的,我发现了问题!谢谢你的帮助。你的代码有注入错误。正确使用
sed
将非常复杂。KISS指示你应该避免
sed
。即使你对注入错误没有问题,
sed
也没有比
perl
更简单。它是除了sed所需的
+
之前的额外
\
之外,实际上是完全相同的程序。你为什么要使用Perl呢?你已经说过Perl是脆弱的?sed已经存在很多年了,它是使用sed修改字符串或代码行的完美工具@ikegami使用sed可能很复杂,但在这种情况下不是这样。我没有说Perl Is易碎;我说过在shell脚本中生成Perl代码是易碎的。在shell脚本中生成sed代码与您一样易碎。事实上,您的
sed
代码构建与OP的Perl代码构建遭受完全相同的注入错误。如果您认为注入错误不复杂,请修复它;我认为您会找到Perl解决方案离子束要简单得多。
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,