Leser: 26
sed -i -e 's/remount,ro,noatime/remount,rw,noatime/g' ${PATH}/etc/inittab
/usr/bin/perl -p -i -e "s/remount,ro,noatime/remount,rw,noatime/g" ${PATH}/etc/inittab
s/remount,ro,noatime/remount,rw,noatime/g ${PATH}/etc/inittab
1
2
3
4
5
jan@syrr:~$ perl -h
-e program one line of program (several -e's allowed, omit programfile)
-i[extension] edit <> files in place (makes backup if extension supplied)
-p assume loop like -n but print line also, like sed
-n assume "while (<>) { ... }" loop around program
1 2 3 4 5 6 7 8 9 10 11 12
my ($in, $out); open($in, "<", "/etc/inittab") or die($!); open($out, ">", "/etc/inittab.new") or die($!); while(my $line = <$in>) { chomp $line; $line =~ s/remount,ro,noatime/remount,rw,noatime/g; print $out $line . "\n"; } close($out); close($in); rename("/etc/inittab.new", "/etc/inittab");
1 2 3 4 5
#!/usr/bin/perl my $file=shift || "/etc/inittab"; (@ARGV,$/)=($file); $_=<>; s/remount,ro,noatime/remount,rw,noatime/g; open(STDOUT, '>', $file); print;
1 2 3 4 5 6
$^I = ""; while (<ARGV>) { s/vorher/nachher/; print; } # aufruf: perl script.pl dateiname
Guest futharksed scheint mir trotzdem kuerzer (duck!) ;-)
`perl -pi -e`
`sed -i -e`
QuoteZudem finde ich es schwer geistig ständig zwischen verschiedenen Programmiersprachen zu wechseln.
system("sed -i -e 's/remount,ro,noatime/remount,rw,noatime/g' ${PATH}/etc/inittab") == 0 or die("Error replace failed! ($?)");
eval{local($^I,@ARGV,$/) = ("",${PATH}/etc/inittab); $_=<>; s/remount,ro,noatime/remount,rw,noatime/g; return 1} or die("replace failed ($@)");
1 2 3 4 5 6 7 8 9 10 11 12 13
sub replace_in_file { my $file=shift; my $regexp=shift; my $replace=shift; my $txt=eval{local(@ARGV,$/)=($file); <>} or die("ERROR Load $file ($@)\n"); $txt=~s/$regexp/&$replace/eg; open(my $fh, >, $file) or die("ERROR write $file ($!)") print $fh $txt; close($fh); } replace_in_file("${PATH}/etc/inittab",qr/remount,ro,noatime/,sub{return 'remount,rw,noatime'});
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use strict; use warnings; use file_ops qw(load_or_die save_or_die); use text_ops qw(replace_simple); my $file="/etc/fstab"; my $txt=load_or_die($file); if(replace_simple(\$txt,'remount,ro,noatime','remount,rw,noatime')) { save_or_die($file,$txt); } else { print "Nothing Changed\n" }
Guest futharkauch gleich direkt als Subroutinen mit demselben Namen wie auf der Bash, aber eben in Perl - so ein Klassiker ist zB 'basename' und 'dirname'.
Guest futharkAndererseits, denke ich, reden wir hier wirklich von komplett unterschiedlichen Dimensionen. Ein Script der Art, "mache das, benenne alle diese Eintraege XY in YX um, und dann mache was anderes; selbe operation fuer diese Liste von Files" ist einfach sehr kurz, sodass ich es bisher auch direkt als Folge von Bash Befehlen geschrieben habe. Mittlerweile sehe ich immer mehr die riesigen Vorteile von Perl hier. Ich kann einfach mal eine Liste von etwas komplexeren Elementen anlegen ohne dazu gleich einen Wust an verschiedensten Arrays zu verwalten, wie auf der Bash, und dann bei jedem Positionen abzaehlen zu muessen oder aehnliches, wenn sich etwas aendert.
Guest futharkAlles in allem, sehe ich, dass es vllt doch auch etwas Geschmacksache ist und es mehrere Wege zu geben scheint, anstatt wirklich etwas dabei "falsch" zu machen, wenn man beides mischt. Persoenlich denke ich, ein konsequentes Verhalten dabei ist sicherlich hilfreich, und "mischen" und "mischen" ist vllt auch noch ein Unterschied.