sed 从文件中提取部分字符串

sed extract part of string from a file

我一直在尝试从如下所示的文件中仅提取部分字符串:

str1=USER_NAME
str2=justAstring
str3=https://product.org/v-4.5-bin.zip
str4=USER_HOME

我只需要提取版本 - 在这种情况下:4.5

我用 grep 然后用 sed 做了,但现在输出是 4.5-bin.zip

-> grep str3 file.txt
str3=https://product.org/v-4.5-bin.zip
-> echo str3=https://product.org/v-4.5-bin.zip | sed -n "s/^.*v-\(\S*\)//p"
4.5-bin.zip

我应该怎么做才能同时删除最后的 -bin.zip? 谢谢。

第一个解决方案:使用您显示的示例,请尝试遵循 sed 代码。

sed -n '/^str3=/s/.*-\([^-]*\)-.*//p' Input_file

说明: 使用 sed-n 选项,默认情况下将停止打印值,只打印匹配的部分。在主程序中检查条件,如果行从 str3= 开始,则在那里执行替换。替换捕获捕获组中第一个 - 和下一个 - 之间的所有内容,并使用 </code> 替换整行,并仅使用 <code>p 选项打印匹配的部分。



第二个解决方案: 使用 GNU grep 你可以尝试遵循 grep 程序。

grep -oP '^str3=.*?-\K([^-]*)' Input_file


第 3 种解决方案: 使用 awk 程序按照所示示例获得预期输出。

awk -F'-' '/^str3=/{print }'  Input_file


第四个解决方案:使用awkmatch函数在使用的帮助下获得预期结果RSTARTRLENGTH 变量,一旦匹配函数找到真正的匹配项,这些变量就会被设置。

awk 'match([=13=],/^str3=.*-/){split(substr([=13=],RSTART,RLENGTH),arr,"-");print arr[2]}'  Input_file

如果您知道版本仅包含数字和点,请将 \S 替换为 [0-9.]。此外,匹配捕获组之外的剩余字符以将其删除。

sed -n 's/^.*v-\([0-9.]*\).*//p'