【发布时间】:2016-04-01 19:12:33
【问题描述】:
给定这个关联数组:
declare -A variables=(
[prefix]='/usr'
[exec_prefix]='@prefix@'
[libdir]='@exec_prefix@/lib'
)
我想将所有出现的模式@([^@/]+)@(例如@prefix@,prefix 是捕获)替换为与捕获关联的值(例如/usr 代表prefix)它的值,以便递归执行替换,直到不再出现。数组中每个键的步骤是:
- 检索与其关联的值并对其执行 (2)。
- 检查给定字符串中的模式是否匹配。
- 如果没有,则返回给定的字符串。
- 如果有匹配项:
- 对捕获执行 (1) 并保留结果。
- 用结果替换匹配项。
- 对结果字符串执行 (2)。
- 删除与键关联的先前值,并将返回的最后一个字符串与其关联。
无论采用何种方法,期望的结果是:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
附加要求:
- 不会发生自我引用(例如
prefix=@prefix@)。 - 如果可能,请仅使用 Bash 内置函数。
Lua 中的示例:
local variables={
prefix="/usr",
exec_prefix="@prefix@",
includedir="@prefix@/include",
libdir="@exec_prefix@/lib",
random_one_to_show_off_fancy_recursion="@prefix@@libdir@@includedir@"
}
function replacer( variable )
return compute_value(variables[variable])
end
function compute_value( s )
return s:gsub('@([^@/]+)@',replacer)
end
local variable, value = next(variables)
while variable do
variables[variable] = compute_value(value)
print( string.format('%-39s\t%s', variable, variables[variable]) )
variable, value = next(variables,variable)
end
【问题讨论】:
-
您要么过度设计外壳解决方案,要么正在寻找免费咨询。 ;-) 。您尝试过什么来解决您的问题?也许您想为此提供 100 点赏金?祝你好运。
-
这需要递归完成吗?这是干什么用的?
-
@shellter 绝对不是在寻找免费咨询!我没有发布任何我尝试过的东西,因为它真的很复杂。作为记录,我尝试了涉及
eval的不同方法,面临几个问题,主要是扩展顺序(例如,libdir不应该在exec_prefix之前评估)。我最终得到了一个 Lua 脚本,我从中提取了上面的示例,但我不想让 Lua 成为对用户的要求。
标签: regex bash recursion replace substitution