所以基本上我有一个包含以下 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 中检查数组中是否存在每个字段,并在适用时替换它。顺便说一句,我用大写字母替换了小写“地址”。