1
2
perl -pne 's/eintrag([\s]*)=([\s]*)([\d]+)[\s]*$/eintrag\1=\2XXXXX/'
perl -pne 's/eintrag([\s]*)=([\s]*)([\d]+)[\s]*(#.*)$/eintrag\1=\2XXXXX\4/'
perl -lpne 's/eintrag(\s*)=(\s*)\d+/eintrag\1=\2XXXXX/'
2012-05-08T13:07:57 bora99Zeichen Trenner zwischen "=" kann sein "<tab>" , "<blank>" oder kein Zeichen. Es ist auch möglich das ein Kommentar, beginnend mit "#" vorkommt.
ich möchte nach "=" den Wert ersetzen, im Bsp: XXXXX
perl -pi.bak -e 's/(.*=\s*)[^#\s]+/$1XXXX/' datei
perl -pi.bak -e 's/(key\s*=\s*)[^#\s]+/$1XXXX/' datei
perl -lpne 's/eintrag(\s*)=(\s*)\d+/eintrag\1=\2XXXXX/'
1
2
3
perl -pi.bak -e 's/(.*=\s*)[^#\s]+/$1XXXX/' datei
perl -pi.bak -e 's/(key\s*=\s*)[^#\s]+/$1XXXX/' datei
perl -pne 's/^([^#]eintrag\s*=\s*)\d+/\1XXXXX/'
2012-05-08T21:15:13 bora99würdet ihr den perl one liner öfter aufrufen pro eintrag oder dies
mir einem perl aufruf abdecken, wie ... 's/eintrag1/.../; s/eintrag2/.../;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#!/usr/bin/perl use warnings; use strict; my $file = 'datei'; my $tmpfile = "$file.tmp"; my %changes = ( 'eintrag1' => 'XXXX', 'eintrag2' => 'foo', # etc. ); open(my $fh, '<', $file) 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;
"perl -i"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/perl
use warnings;
use strict;
# Imports for certain functions
use POSIX;
use Fcntl ':mode';
if( $#ARGV == -1)
{
print STDERR "Usage: $0 <eintrag1> <wert1>.. :\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";
}
}
2012-05-09T17:34:49 bora99Auch ein Versuch einer Erweiterung ist , daß es variabel für 5 parameter gestaltet werden kann, wie man es flexibel für zig werte gestalten kann, hmmm, weiß ich nicht.
zu guter Letzt, wie kann man Gross / Kleinbuchstaben von Eintrag ignorieren, wie "Eintrag" , "eintrag"
1 2 3 4 5 6 7 8 9 10
my ($file, @args) = @ARGV; die "gib mich datei" unless $file; my %changes; for my $arg (@args) { my ($key, $value) = split('=', $arg); die "doofes argument" unless ($key and $value); $changes{$key} = $value; }
2012-05-09T19:52:08 topegmal sinnvoll überarbeitet:
Code (perl): (dl )1 2 3 4 5while(@ARGV) { my ($k,$v)=split(/\s*=\s*/,shift(@ARGV),2); $changes{$k}=$v; }
QuoteIch würde nebenbei gerne wissen was bei meiner Form der Ersetzung nicht funktioniert.
2012-05-09T21:44:00 FIFOWhitespace innerhalb eines @ARGV-Elements kann ja eigentlich nur vorkommen, wenn dieses einen quoted string enthält ... ich würde diesen Fall eher nicht zulassen.
2012-05-09T21:44:00 FIFODeine Version gilt für den Fall, dass die Kommentierung vor 'eintrag' beginnt, im Beispiel des OP war der Kommentar an die key=value Zeile angehängt.
2012-05-10T00:19:26 topegVorher wurde erzwungen das zwischen Anfang der Zeile und "eintrag" ein Zeichen vorkommt das kein "#" ist.
Quote(beachte [^ ... ] das ^ invertiert den Inhalt)
script.pl datei eintrag1=NEU1
1 2 3 4 5 6 7 8 9
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; }
./script.pl datei eintrag1=NEU1 eintrag2=NEU2
script.pl "/pfad/zu einer/datei mit space" "ein config wert = text mit space" 'b = "a = b = c"' c=12345
script.pl datei "ein config wert=XX"
1 2 3 4 5 6 7 8 9
while (my $line = <$rfh>) { if($line=~/^\s*([^=\s#][^=#]+?)\s*=/) { my $key=lc($1); $line =~ s/(=\s*)[^#\s]+/$1$changes{$key}/ if(defined($changes{$key})); } print $tfh $line; }
$line =~ s/(=\s*)[^#\s]+/$1$changes{$key}/ if(defined($changes{$key}));
script.pl datei "ein config wert=XX NEU"
script.pl datei eintrag1=\"NEU1\"
$line =~ s/(=\s*)[^#\s]+(?:\s+[^#\s]+)*/$1$changes{$key}/ if(defined($changes{$key}));