1

我正在使用 sed 进行一些模式匹配并从某些输入中提取点点滴滴,并且我想使用这些捕获的组作为索引来访问字典中的元素。

例如我想要下面的代码:

TASK_TO_IP["task1"]=127.0.0.1
echo "sent task1 to slave" | sed -rn "s/sent ([[:graph:]]+) .*/Found ${TASK_TO_IP[\1]}/p"

输出:Found 127.0.0.1

相反,我得到:Found

如何使用捕获的 sed 组作为该字典的键?

4

2 回答 2

3

参数扩展将在调用 sed 之前发生。您必须执行类似(未经测试)的操作:

output=$(
  echo "sent task1 to slave" | 
  sed -rn 's/sent ([[:graph:]]+) .*/Found ${TASK_TO_IP[\1]}/p'
)
eval echo "$output"

我会采取不同的方法:首先从字符串中提取任务 id,然后将其用于哈希查找:

line="sent task1 to slave"
taskid=$( grep -oP 'sent \K\w+' <<< "$line" )
echo "Found ${TASK_TO_IP[$taskid]}"
于 2013-11-08T14:36:29.573 回答
2

我会在这里使用包装脚本。用于sed获取task1并将其存储在变量中。

var="$(sed 's/sent \([^ ]*\).*/\1/' <<< 'sent task1 to slave')"

接着

echo "${TASK_TO_IP[$var]}"
于 2013-11-08T14:34:47.207 回答