![从变量中的一个句子中提取一个单词](https://linux22.com/image/1584220/%E4%BB%8E%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E4%B8%80%E4%B8%AA%E5%8F%A5%E5%AD%90%E4%B8%AD%E6%8F%90%E5%8F%96%E4%B8%80%E4%B8%AA%E5%8D%95%E8%AF%8D.png)
我有一个包含以下值的变量:|| InstanceId | i-0f85cb9ccb11fd035 ||
该变量是动态生成的,我需要从该变量中提取 InstanceId 值。
实例 ID 始终以单管道和双管道开头,I-
或者位于单管道和双管道之间。
尝试在 MacOS bash 脚本上使用 grep 来执行此操作。如有任何帮助,不胜感激。
答案1
要替换字符串,您需要使用sed
。操作方法如下。
$ var="|| InstanceId | i-0f85cb9ccb11fd035 ||"
$ printf '%s\n' "$var" | sed -r 's/\|\|[^\|]+\| [iI]-([^ ]+) \|\|/\1/g'
's/\|\|[^\|]+\| [iI]-([^ ]+) \|\|/\1/g'
是您需要了解的模式。
s/something/replacement/g
意思是用“替换”来替换任何出现的“某物”。
\|
只是一个转义的管道字符。
因此,我们要查找两个竖线,后跟[^\|]+
,即一串一个或多个非竖线字符。后跟另一个竖线和一个空格,\|
。然后我们匹配i-
或I-
,读取一串非空格字符,使用括号将它们分组,([^ ]+)
后跟空格和两个竖线\|\|
。
然后我们用第一组替换这整个东西,也就是\1
。