Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带有oldvalue:newvalue的csv文件替换文件和文件名中的字符串_Csv_Rename - Fatal编程技术网

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

如何使用带有oldvalue:newvalue的csv文件替换文件和文件名中的字符串,csv,rename,Csv,Rename,我们有大量规则文件,这些文件的文件名中包含>200个电话号码中的一个,并且/或者引用文件本身中的电话号码。 现在,这些电话号码中的大多数需要更改,因此我们有一个输入csv文件,其中有一列用于旧电话号码,另一列用于电话号码。 另外,在包含电话号码的文件中也有注释,但在正确的位置有空格,例如0800 123 456。 csv文件中的电话号码也与注释中的空格相同 我们想要实现的是编写一个(Shell)脚本来读取csv文件,并将文件中出现的所有旧电话号码(带空格和不带空格)替换为新电话号码(同样在注释中

我们有大量规则文件,这些文件的文件名中包含>200个电话号码中的一个,并且/或者引用文件本身中的电话号码。
现在,这些电话号码中的大多数需要更改,因此我们有一个输入csv文件,其中有一列用于旧电话号码,另一列用于电话号码。
另外,在包含电话号码的文件中也有注释,但在正确的位置有空格,例如0800 123 456。
csv文件中的电话号码也与注释中的空格相同

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


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

我自己也能找到解决方案。它并不漂亮,也远没有效率,但它确实起到了作用。 先决条件是输入文件,其中包含以下格式的行:

<old string>;<new string>
使用带空格的数字的原因是我们在每个文件的注释中都有它,所以我们需要替换这两种类型

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

#/bin/bash
读行时
做
OLD='echo$line | awk-F\'{打印$1}'`
##删除前导空格和尾随空格
OLDTRIM=“$(echo-e“${OLD}”| sed-e的/^[:space:]*/'-e的/[:space:]*/'-e的/[:space:]*$/')
NEW=“$(echo$行| awk-F\”{print$2})”
NEWTRIM=“$(echo-e“${NEW}”| sed-e的/^[:space:]*/'-e的/[:space:]*/'-e的/[:space:]*$/')
#删除所有空格
OLDPURE=“$(echo-e“${OLD}”| tr-d'[:space:][]”)
NEWPURE=“$(echo-e“${NEW}”| tr-d'[:space:][])”
#先重命名文件
查找src-exec rename${OLDPURE}${NEWPURE}{}\;
#在文件中查找并替换两个版本
读取文件时查找src-type f |
做
sed-i“s/${OLDTRIM}/${NEWTRIM}/g”$文件
sed-i“s/${OLDPURE}/${NEWPURE}/g”$文件
完成
完成
012 345 67 89
#!/bin/bash

while read line
do
  OLD=`echo $line | awk -F\; '{print $1}'`
  ## Remove leading and trailing spaces
  OLDTRIM="$(echo -e "${OLD}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
  NEW="$(echo $line | awk -F\; '{print $2}')"
  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