#!/usr/bin/perl use warnings; use strict; # Imports for certain functions use POSIX; use Fcntl ':mode'; if( $#ARGV == -1) { print STDERR "Usage: $0 .. :\n"; exit 1; } my $eintrag1 = $ARGV[0] or die "definieren eintrag1.\n"; my $wert1 = $ARGV[1] or die "definiieren wert1 .\n"; my $eintrag2 = $ARGV[2] or die "definieren eintrag2.\n"; my $wert2 = $ARGV[3] or die "definieren wert2 .\n"; my $file = $ARGV[4] or die "definieren file .\n"; #my $file = 'datei'; #my $tmpfile = "$file.tmp"; my $tmpfile = ""; my $file_typ = ""; my $real_filename = ""; my %changes = ( #'eintrag1' => 'XXXX', $eintrag1 => $wert1, #'eintrag2' => 'foo', $eintrag2 => $wert2, # etc. ); $file_typ = get_file_typ ($file); if ( $file_typ eq '-1' || $file_typ eq '-2' ) { print STDERR "Fehler bei Ermitteln File_Typ\n"; } elsif ( $file_typ eq 'l' ) { $real_filename = readlink_2_get_file ($file); } else { $real_filename = $file; } $tmpfile = "$file.tmp"; open(my $fh, '<', $real_filename) or die $!; open(my $th, '>', $tmpfile) or die $!; LINE: while (my $line = <$fh>) { #KEY; for my $key (keys %changes) { if ($line =~ s/($key\s*=\s*)[^#\s]+/$1$changes{$key}/) { print $th $line; next LINE; } } print $th $line; # kein Match } close($fh) or die $!; close($th) or die $!; unlink $file; # oder als Backup speichern rename $tmpfile, $file; exit 0; #### Exportable Functions sub get_file_typ { my $ofile = shift; my ( $mode, $type, $return_file_typ ); if ( $ofile ne "" ) { if ( -e $ofile ) { # note: if the file is a symlink (type "l"), you might # want to use lstat() instead of stat() # note: "use POSIX" doesn't seem to provide constants for types # "n" "s" or "l" $mode = ( lstat $ofile )[2]; $type = "b" if ( S_ISBLK($mode) ); $type = "c" if ( S_ISCHR($mode) ); $type = "d" if ( S_ISDIR($mode) ); $type = "p" if ( S_ISFIFO($mode) ); $type = "s" if ( S_ISSOCK($mode) ); $type = "l" if ( S_ISLNK($mode) ); $type = "f" if ( S_ISREG($mode) ); $return_file_typ = $type; } else { # file not found $return_file_typ = "-1"; } } else { # no ARGV $return_file_typ = "-2"; } return ($return_file_typ); } sub readlink_2_get_file { my $ofile = shift; my ( $return_readlink ); if ( $ofile ne "" ) { if ( -l $ofile ) { $return_readlink = readlink( $ofile ); } else { # link not found $return_readlink = "-1"; } } else { # no ARGV[0] $return_readlink = "-2"; } }