使用基于该字符串

时间:2016-05-17 13:31:45

标签: bash sed ip-address substitution

我正在尝试解析IP地址的文件,然后将其替换为 1 for 1 映射的IP地址。例如,查找1.1.1.1的所有实例,并将这些实例替换为100.100.1.1,将所有实例替换为5.5.5.5,并将其替换为100.100.5.5。可能有数千个IP,因此我不想使用静态 sed 命令为每次替换解析文件。

我正在尝试使用关联数组,但我没有做到。

echo "1.1.1.1 5.5.5.5" > testfile.txt
declare -A testarray
testarray[ip_1.1.1.1]="100.100.1.1"
testarray[ip_5.5.5.5]="100.100.5.5"
sed -r "s/(([0-9]{1,3}\.){3}[0-9]{1,3})/${testarray[ip_\1]}/g" testfile.txt

在变量中使用捕获组并不起作用。但是直接使用文本。

sed -r "s/(([0-9]{1,3}\.){3}[0-9]{1,3})/${testarray[ip_1.1.1.1]}/g" testfile.txt
100.100.1.1 100.100.1.1

当然这会用100.100.1.1替换所有IP,我想根据数组关联进行替换。

有没有办法让一个捕获组在变量中使用它来替换 bash ?我已尝试使用引号的几个变体以及提前构建变量仍然取决于' \ 1'但它要么失败,要么只返回变量文字输出。我不知道是否有比 sed 更好的工具。 我也尝试使用变量而不是数组,但我遇到了同样的问题。

1 个答案:

答案 0 :(得分:0)

POSIX shell脚本,输入为 testfile.txt ,逗号分隔“从到”对在 replacements.txt

echo 1.1.1.1 100.100.1.1 ,5.5.5.5 100.100.5.5 | tr ',' '\n' > replacements.txt
echo "1.1.1.1 6.7.8.9 5.5.5.5" | tr ' ' '\n' > testfile.txt

while read x ; do
    while read a b ; do
        if [ $a = $x ] ; then
            x=$b
            break
        fi
    done < replacements.txt
    echo $x
done < testfile.txt

输出:

100.100.1.1
6.7.8.9
100.100.5.5

注意:效率低下,它为 testfile.txt 的每一行重新读取至少一行 replacements.txt ,但这确实允许替换列表大于 bash 的可用内存。