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
第四个解决方案:使用awk
的match
函数在使用的帮助下获得预期结果RSTART
和 RLENGTH
变量,一旦匹配函数找到真正的匹配项,这些变量就会被设置。
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'
我一直在尝试从如下所示的文件中仅提取部分字符串:
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
第四个解决方案:使用awk
的match
函数在使用的帮助下获得预期结果RSTART
和 RLENGTH
变量,一旦匹配函数找到真正的匹配项,这些变量就会被设置。
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'