#!/usr/bin/perl use warnings; use strict; Usage('NO ARGUMENTS!') unless(@ARGV); Usage() if(grep{$_ eq '-h' || $_ eq '--help'}@ARGV); my $file=shift(@ARGV) or USAGE('No File defined'); my %changes; while(@ARGV) { my ($k,$v)=split(/\s*=\s*/,shift(@ARGV),2); $changes{$k}=$v; } Usage("No Changes defined") unless(%changes); die("File $file not exists!\n") unless(-e $file); my $real_filename=$file; while(-l $real_filename) { $real_filename=readlink($real_filename); die("Can't read symbolic Link ($!)\n") unless($real_filename); die("File $real_filename not exists!\n") unless(-e $real_filename); } die("$real_filename is not a file!\n") unless(-f $real_filename); my $tmpfile = "$file.tmp"; open(my $rfh, '<', $real_filename) or die("Can't open $real_filename ($!)\n"); open(my $tfh, '>', $tmpfile) or die("Can't open $tmpfile ($!)\n"); while (my $line = <$rfh>) { if($line=~/^[^#]*?([^=\s]+)\s*=/) { my $key=lc($1); $line =~ s/(=\s*)[^#\s]+/$1$changes{$key}/i if(defined($changes{$key})); } print $tfh $line; } close($tfh) or die("ERROR close $tmpfile ($!)\n"); close($rfh) or die("ERROR close $real_filename ($!)\n"); # neben symbolischen Links gibt es noch über das Dateisystem gelinkete Dateien. # Siehe unterschied zwischen "ln" und "ln -s" # Wenn man eine dieser Dateien Ersetzt geht die Verlinkung verloren. # darum ist es sinnvoll den altern Inhalt zu überschreiben, # um die Verlinkung zu erhalten. open($tfh, '<:raw', $tmpfile) or die("Can't open $tmpfile ($!)\n"); open($rfh, '>:raw', $real_filename) or die("Can't open $real_filename ($!)\n"); my $chunk; print $rfh $chunk while(read($tfh,$chunk,4096)); close($rfh) or die("ERROR close $real_filename ($!)\n"); close($tfh) or die("ERROR close $tmpfile ($!)\n"); unlink($tmpfile) or die("Can't delete $tmpfile\n"); # wenn dir das egal ist kannst du natürlich auch die schnelle Variante nutzen. #unlink($real_filename) or die("Can't delete $real_filename\n"); # oder als Backup speichern #rename($tmpfile, $real_filename) or die("Error Can't rename $tmpfile to $real_filename ($!)\n"); exit 0; ######################################################################## sub Usage { my $msg=shift; my $out=\*STDOUT; if($msg) { $out=\*STDERR; print $out "$msg\n"; } print $out "Usage: $0 file = [= [...] ] \n"; exit 1 if($msg); exit 0; }