Thread perl one liner : string suchen und ersetzen wert (unix) (17 answers)
Opened by bora99 at 2012-05-08 15:07

bora99
 2012-05-09 19:34
#158257 #158257
User since
2009-12-05
54 Artikel
BenutzerIn
[default_avatar]
hallo FIFO

im habe entdeckt, daß mit
Code: (dl )
"perl -i"
im Unix der Link gelöscht wird.

Bsp: echo "AA" > datei
ln -sf datei link_file
perl -i .... link
der Link ist dann weg und Link link_file ist ein File

Dies passiert mit dem Script von dir auch.

Daher habe ich versucht , zu überprüfen, ob File ein Link ist und wenn es ein Link ist, den Datei Namen zu verwenden.

Auch 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"

Aufruf:
./perl_key_change.pl eintrag1 wert1 eintrag2 wert2 link_file

Code: (dl )
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";
}
}


gruss

View full thread perl one liner : string suchen und ersetzen wert (unix)