替换文本字符串中的变量



我在bash中的一个变量中有一个文本字符串,看起来像这样:

filename1.txt
filename2.txt
varname1 = v1value
$(varname1)/filename3.txt
$(varname1)/filename4.txt
varname2 = $(varname1)/v2value
$(varname2)/filename5.txt
$(varname2)/filename6.txt

我想替换所有的变量,产生这个:

filename1.txt
filename2.txt
v1value/filename3.txt
v1value/filename4.txt
v1value/v2value/filename5.txt
v1value/v2value/filename6.txt

有人能建议一个干净的方法在壳里做这件事吗?

在awk:中

BEGIN {
    FS = "[[:space:]]*=[[:space:]]*"
}
NF > 1 {
    map[$1] = $2
    next;
}
function replace(     count)
{
    for (key in map) {
        count += gsub("\$\("key"\)", map[key])
    }
    return count
}
{
    while (replace() > 0) {}
    print
}

在lua:

local map = {}
--for line in io.lines("file.in") do -- To read from a file.
for line in io.stdin:lines() do -- To read from standard input.
    local key, value = line:match("^(%w*)%s*=%s*(.*)$")
    if key then
        map[key] = value
    else
        local count
        while count ~= 0 do
            line, count = line:gsub("%$%(([^)]*)%)", map)
        end
        print(line)
    end
end

我使用m4:找到了一个合理的解决方案

function make_substitutions() {
    # first all $(varname)s are replaced with ____varname____
    # then each assignment statement is replaced with an m4 define macro
    # finally this text is then passed through m4
    echo "$1" |
    sed 's/$(([[:alnum:]][[:alnum:]]*))/____1____/' | 
    sed 's/ *([[:alnum:]][[:alnum:]]*) *= *(..*)/define(____1____, 2)/' | 
    m4
}

也许

echo "$string" | perl -nlE 'm/(w+)s*=s*(.*)(?{$h{$1}=$2})/&&next;while(m/$((w+))/){$x=$1;s/$($x)/$h{$x}/e};say$_'

打印

filename1.txt
filename2.txt
v1value/filename3.txt
v1value/filename4.txt
v1value/v2value/filename5.txt
v1value/v2value/filename6.txt

相关内容

  • 没有找到相关文章

最新更新