1

有没有一种简单的方法来替换流中所有出现的变量?

所以假设我有一个包含内容的文件。

$FOO $BAR $BAZ

我想做一些类似的事情

less file | replaceVars | process

replaceVars 步骤应将所有对变量的引用替换为它们的值。我不想指定我想要替换的变量(就像我在使用 sed 或类似的东西时需要的那样)。是否有一个内置函数或小程序允许我使用 bash 解析器或其他东西来做这个替换?

4

2 回答 2

3

创建一个这样的函数

function replaceVars {
    local V IFS=
    while read -r LINE; do
        for V; do
            LINE=${LINE//"$V"/"${!V}"}
        done
        echo "$LINE"
    done
}

你可以像这样在流上调用它:

cat file | replaceVars FOO BAR BAZ | process

我替换catless因为less并没有真正与标准输出交互,而是终端本身。您也可以这样做:

replaceVars FOO BAR BAZ < file | process

如果要将这些变量名存储在数组中,可以这样做:

VARS=(FOO BAR BAZ)
replaceVars "${VARS[@]}" < file | process

顺便说一句,请确保您将其作为 Bash 运行。它的完整脚本示例可能是这样的:

#!/bin/bash

VARS=(FOO BAR BAZ)

function replaceVars {
    local V IFS=
    while read -r LINE; do
        for V; do
            LINE=${LINE//"$V"/"${!V}"}
        done
    done
    echo "$LINE"
}

replaceVars "${VARS[@]}" < file | process
于 2013-08-14T08:36:49.150 回答
2

使用eval

while read -r line; do eval echo "${line}"; done < inputfile | process

这将在将输出传递到进程之前扩展输入文件中的变量。

于 2013-08-14T08:32:16.047 回答