如何使用带有 oldvalue:newvalue 的 csv 文件替换文件和文件名中的字符串

How to use a csv file with oldvalue:newvalue to replace string inside files and filenames

我们有大量规则文件在其文件名中包含 >200 个电话号码之一 and/or 在文件本身中引用电话号码。
现在大部分电话号码都需要更改,所以我们有一个输入 csv 文件,其中有一列用于旧电话号码,一列用于电话号码。
作为一个额外的复杂因素,文件中还有包含电话号码的注释,但在正确的位置有空格,例如0800 123 456.
csv文件中的电话号码也与评论中的空格一样。

我们想要实现的是编写一个 (Shell) 脚本来读取 csv 文件并将文件中所有出现的旧电话号码(有和没有空格)替换为新电话号码(再次注释中有空格,其他地方没有空格)。 此外,如果发现文件名中包含电话号码,则应重命名该文件。

我确信这可以使用 sed 和类似工具来完成,但我缺乏使用 sed 的经验。

我自己找到了解决办法。它并不漂亮,也远非高效,但它完成了工作。 先决条件是一个输入文件,其中包含以下格式的行:

<old string>;<new string>

我的 "old string" 是 phone 格式的数字

012 345 67 89

数字带有空格的原因是我们在每个文件的注释中都有它,所以我们需要替换这两种类型。

这是我的 BASH 脚本,假设您要扫描子目录 "src" 中的所有文件并且您的输入文件名为 "bns.csv":

#!/bin/bash

while read line
do
  OLD=`echo $line | awk -F\; '{print }'`
  ## Remove leading and trailing spaces
  OLDTRIM="$(echo -e "${OLD}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
  NEW="$(echo $line | awk -F\; '{print }')"
  NEWTRIM="$(echo -e "${NEW}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
  # Remove all spaces
  OLDPURE="$(echo -e "${OLD}" | tr -d '[[:space:]]')"
  NEWPURE="$(echo -e "${NEW}" | tr -d '[[:space:]]')"

  # Rename files first
  find src -exec rename ${OLDPURE} ${NEWPURE} {} \;

  #Find and replace both versions inside file
  find src -type f | while read file
  do
    sed -i "s/${OLDTRIM}/${NEWTRIM}/g" $file
    sed -i "s/${OLDPURE}/${NEWPURE}/g" $file
  done
done <bns.csv

欢迎任何优化提示。