使用另一个文件中的值作为输入编辑文件并将文件编辑重定向到另一个文件

使用另一个文件中的值作为输入编辑文件并将文件编辑重定向到另一个文件

所以基本上我有一个包含以下 Data.txt 的文件

<IP Address1>, 10, 23, <GW IP1>
FINAL INPUT.45.324
<IP Address2>, 40, 33, <GW IP2>

另一个文件,其中包含 info.txt 中指定的每个标签的值

<IP Address1>10.155.120.20
<GW IP1>10.155.120.30
<IP address2>10.30.123.30
<GW IP2>10.30.123.1

希望最终看起来像这样(file.txt)

10.155.120.20, 10, 23, 10.155.120.30
FINAL INPUT.45.324
10.30.123.30, 40, 33, 10.30.123.1

试图找到例子,但我无法弄清楚

答案1

您正在寻找的东西称为模板引擎。我extremly simple not reliable为你做了一个。它基于 sed,并且可能非常脆弱。

请注意,您没有<IP address2>10.30.123.30,所以<IP Address2>10.30.123.30我的脚本没有按预期工作。完整代码如下:

#!/usr/bin/env bash
cat <<EOF >file_1
<IP Address1>, 10, 23, <GW IP1>
FINAL INPUT.45.324
<IP Address2>, 40, 33, <GW IP2>
EOF
cat <<EOF >file_2
<IP Address1>10.155.120.20
<GW IP1>10.155.120.30
<IP Address2>10.30.123.30
<GW IP2>10.30.123.1
EOF
cp file_1 file_final
while read to_split; do
    echo "to_split: $to_split"
    arg1="${to_split%>*}>" # > because it is removed
    arg2="${to_split#*>}"
    echo "1: $arg1"
    echo "2: $arg2"
    sed -i  "s/$arg1/$arg2/g" file_final
done < file_2

该脚本是自包含的,因此您可以自己尝试:)。

问题是我不能说这是一个很好的解决方案。这真实的解决方案是使用像 Jinja2 这样的模板引擎。

答案2

会走多远

awk  '
NR==FNR         {T[$1 FS] = $2
                 next
                }
                {for (i=1; i<=NF; i++) if ($i in T) $i = T[$i]
                }
1
'
FS=">" file2 FS=", " OFS=", " file1
10.155.120.20, 10, 23, 10.155.120.30
FINAL INPUT.45.324
10.30.123.30, 40, 33, 10.30.123.1

我懂了?它将 file2 中的替换值收集到由标签索引的数组中,然后在数据 file1 中检查数组中是否存在每个字段,并在适用时替换它。顺便说一句,我用大写字母替换了小写“地址”。

相关内容