如何使用带有 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
欢迎任何优化提示。
我们有大量规则文件在其文件名中包含 >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
欢迎任何优化提示。