我想使用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则无关紧要。
谢谢!
答案 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);
,因为它很慢并且在磁盘上产生大量流量。我建议将输出缓存在一个数组中将其保存在脚本的末尾。
感谢您的回答,但它们在大多数情况下都有效但不是我的问题的解决方案,因为它们在文件中的内容主要有问题。