Bash:用数组替换文件中的字符串

时间:2017-01-04 12:33:24

标签: arrays bash replace

我想使用bash数组替换文件中的字符串。

e.g。文件example.txt:

A: Netherlands
B: Germany
C: United States
A: Netherlands
[Edit #2: In the file are also different strings without the format X:Y]
C, N: United States

现在我想要一个bash脚本来替换字母(编辑:冒号前),所以它变成了

A => Amsterdam
B => Berlin
C => Chicago
N => New York

所以最后我想要

Amsterdam: Netherlands
Berlin: Germany
Chicago: United States
Amsterdam: Netherlands
[Edit #2: In the file are also different strings without the format X:Y]
Chicago, New York: United States

这是使用bash脚本,但如果我们包含其他脚本语言如perl则无关紧要。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果A B C是唯一的情况:

awk 'BEGIN{FS=OFS=":";d["A"]="Am..";d["B"]="Berl..";d["C"]="Chica.."}
     {$1=d[$1]}7' file

如果你有很多A, B, C, ...A1..Ab...Ax...。我建议你用这种格式创建一个字典文件(dict.txt):

A:Am...
B:Berlin...
C:Cfoo
D:Dbar...
.....
....
Z:Zwhatever

然后你可以:

awk -F':' -v OFS=":" 'NR==FNR{d[$1]:$2;next}{$1=d[$1]}7' dict.txt yourFile

以上代码未经过测试,但我的眼睛编译器告诉它应该去。 ^ _ *

根据问题更改

进行更新

如果$ 1中有CSV,您可以先split()然后获取d[splitedElements]并连接结果。这是微不足道的改变,但我相信你想弄脏手。

答案 1 :(得分:0)

<?php
$source = file("/path/to/input/file.txt");
$lines = count($source);
$town = array();
$town["A"] = "Amsterdam";
$town["B"] = "Berlin";
$town["C"] = "Chicago";
$town["N"] = "New York";
for($i=0;$i < $lines; $i++)
{
  $line = $source[$i];
  if (strpos($line,":"))
  {
    foreach($town as $a => $v)
    {
      $c_town = explode(":",$line);
      $c_town[0] = str_replace($a,$v,$c_town[0]);
      $line = implode(":",$c_town);
    }
  }
  echo $line; # or do what you want with it
}

最后,我通过使用外部PHP脚本解决了我的问题。我知道有更好的方法,因为php并不总是预先安装在操作系统上,但效果最好。 因为脚本每行解析文件行,所以不要使用write命令替换echo(例如file_put_contents("/path/to/file",$line,FILE_APPEND);,因为它很慢并且在磁盘上产生大量流量。我建议将输出缓存在一个数组中将其保存在脚本的末尾。

感谢您的回答,但它们在大多数情况下都有效但不是我的问题的解决方案,因为它们在文件中的内容主要有问题。