如何在bash中使用捕获的sed组作为字典的键

时间:2013-11-08 14:12:26

标签: regex bash dictionary sed

我使用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组用作此词典的关键?

2 个答案:

答案 0 :(得分: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]}"

答案 1 :(得分:2)

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

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

然后

echo "${TASK_TO_IP[$var]}"