Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash SED仅将第一次出现的图案替换为“即使”;g";旗帜_Bash_Shell_Unix_Sed_Sh - Fatal编程技术网

Bash SED仅将第一次出现的图案替换为“即使”;g";旗帜

Bash SED仅将第一次出现的图案替换为“即使”;g";旗帜,bash,shell,unix,sed,sh,Bash,Shell,Unix,Sed,Sh,我有一个字符串,我想用新值替换现有版本号字符串,但sed只替换第一次出现的版本号字符串,而不是全部 我也尝试过使用g标志,即 输入 Old_Version="1.0.0" New_Version="2.0.0" SEARCH_STRING="Unique String" echo 'versionString = isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String' | sed -e "s/$Ol

我有一个字符串,我想用新值替换现有版本号字符串,但sed只替换第一次出现的版本号字符串,而不是全部

我也尝试过使用g标志,即

输入

Old_Version="1.0.0"
New_Version="2.0.0"
SEARCH_STRING="Unique String"


echo 'versionString =  isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String' |
sed -e "s/$Old_Version\(.*$SEARCH_STRING\)/$New_Version\1/g"
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 1.0.0"; // Unique String
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 2.0.0"; // Unique String
输出

Old_Version="1.0.0"
New_Version="2.0.0"
SEARCH_STRING="Unique String"


echo 'versionString =  isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String' |
sed -e "s/$Old_Version\(.*$SEARCH_STRING\)/$New_Version\1/g"
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 1.0.0"; // Unique String
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 2.0.0"; // Unique String
正如您在上面所看到的,它只替换了第一版,而不是第二版,即

所需输出

Old_Version="1.0.0"
New_Version="2.0.0"
SEARCH_STRING="Unique String"


echo 'versionString =  isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String' |
sed -e "s/$Old_Version\(.*$SEARCH_STRING\)/$New_Version\1/g"
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 1.0.0"; // Unique String
versionString =  isMajor? "Major Version 2.0.0" : "Minor Version 2.0.0"; // Unique String
此外,搜索模式字符串可以是行中的任何唯一文本。它不必是行中的最后一个文本/注释


任何帮助都将不胜感激。

这是因为“旧”版本的第二个实例被捕获在正则表达式的
*
部分

我假设您希望限制替换包含搜索字符串的行,在这种情况下,您将编写

$ input='versionString =  isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String'
$ sed -e "/$SEARCH_STRING/ s/$Old_Version/$New_Version/g" <<<"$input"
这表示“仅对匹配搜索字符串的行,执行s///g命令”


请注意,点是一个正则表达式特殊字符。由于要匹配文字点,旧版本中的点应该转义,否则可以匹配“19090”之类的内容


$sed-e/$SEARCH\u STRING/s/${Old\u Version/././\\.}/$New\u Version/g“这是因为“Old”版本的第二个实例被捕获在正则表达式的
*
部分

我假设您希望限制替换包含搜索字符串的行,在这种情况下,您将编写

$ input='versionString =  isMajor? "Major Version 1.0.0" : "Minor Version 1.0.0"; // Unique String'
$ sed -e "/$SEARCH_STRING/ s/$Old_Version/$New_Version/g" <<<"$input"
这表示“仅对匹配搜索字符串的行,执行s///g命令”


请注意,点是一个正则表达式特殊字符。由于要匹配文字点,旧版本中的点应该转义,否则可以匹配“19090”之类的内容

$sed-e/$SEARCH\u STRING/s/${Old\u Version/././\.}/$New\u Version/g”