PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String in mehreren Dateien ersetzen



The Crusher
26.08.2005, 11:01
Hallo zusammen,

ich bräuchte ein Shell-Skript, das folgendes tut:

- lese alle Dateien im aktuellen Verzeichnis, die auf .html enden, ein
- ersetze in all diesen Dateien den String "/icon" durch "icon"
- speichere die Dateien dann wieder ab

Ist wahrscheinlich für euch Cracks hier kein Problem. :) Das blöde ist, dass ich das Skript eigentlich sofort brauche und so schnell werde ich es nicht hinbekommen. Bin noch unerfahren im Shell-Skripting und würde mich über Hilfe freuen !

Thanx,
The Crusher

hex
26.08.2005, 11:04
Ich würde dir einen HTML-Editor empfehlen, welcher "Suchen und Ersetzen" kann, z.B. Bluefish. Das umständliche programmieren eines Shell-Skriptes wäre imho reine Zeitverschwendung! :)

EDIT: Oder hast du nur eine Konsole zur Verfügung? Dann ist Bluefish natürlich keine Lösung *g*


mfg hex

The Crusher
26.08.2005, 11:12
Nee, ich brauche definitv ein Shellskript ...

Cyber
26.08.2005, 11:28
#!/bin/sh
WORKDIR=/dein/html/verzeichnis/

cd $WORKDIR
for i in `ls *.[hH][tT][mM][lL]`
do
mv $i $i.tmp
cat $i.tmp | sed -e 's/\/icon/icon/g' >> $i
rm $i.tmp
done


So auf die schnelle.

Xanti
26.08.2005, 11:34
find . -iname "*.html" -depth 1 -exec sed -i "" -e "s/\/icon/icon/g" {} \;

Gruss, Phorus

Cyber
26.08.2005, 11:39
@Phorus:
Hehe, und wenn jetzt noch der Wolfgang seinen perl-Einzeiler vom Stapel lässt (*duck*), dann bestätigen wir wiedermal, dass doch nichts über kryptisch verkettete Befehle geht ;) .

Xanti
26.08.2005, 11:43
:)

Perl ist leider nicht erlaubt.

Gruss, Phorus

The Crusher
26.08.2005, 11:53
Super ! Danke für die schnelle Hilfe, Jungs !

Wolfgang
26.08.2005, 18:55
@Phorus:
Hehe, und wenn jetzt noch der Wolfgang seinen perl-Einzeiler vom Stapel lässt (*duck*), dann bestätigen wir wiedermal, dass doch nichts über kryptisch verkettete Befehle geht ;) .
:D :D
Hehe
auch wenn es verboten ist
perl -pi -e '~s|/\.icon|icon|' *html
IMHO mit GNU sed
sed -i -e '~s|/\.icon|icon|' *html

Gruß Wolfgang

Xanti
26.08.2005, 20:38
:D :D
Hehe
auch wenn es verboten ist
perl -pi -e '~s|/\.icon|icon|' *html
IMHO mit GNU sed
sed -i -e '~s|/\.icon|icon|' *html

Gruß Wolfgang

Arg, da hab ich vor lauter Bäumen den Wald nicht gesehen :)

whitey
10.10.2005, 13:56
Hallo ihr lieben,

der Einzeiler ist ja schon echt super.
Ich hab ein aehnliches Problem, aber ich glaube nicht das man es in eine Zeile packen kann.

Die Zeile...

perl -pi -e '~s|subdomain\.domainname\.org|neu-subdomain\.domainname\.org|' *
...wandelt mir meinen String wie gewuenscht um.
subdomain.domainname.org wird umbenannt in neu-subdomainname.org

Leider wird aber auch...
neusubdomain.domainname.org umbenannt in
neu-neusubdomainname.org

Und da ist der haken. Ich muss alle ascii zeichen ausklammern vor dem subdomain.domain.org jedoch steht vor dem subdomain.domain.org of ein " , / , : oder leerzeichen die erlaubt sein soll. Wobei wir beim dem anscheinend sehr beliebten Thema Regular Expressions waeren .

Soweit hab ich mich schon schlau gemacht
[^0-9a-zA-Z] vor subdomain.domain.org sollen verboten sein.
fuer Grep also [[:alnum:]]
Die restlichen moeglichen Zeichen die evtl zu erwarten waeren und eine Aenderung ausschliessen sollen:
- _ @ # .
[[:alnum]_-\@\#\.]

Also muss ich ein Shellskript schreiben.
Nur wie ? (ich bin totaler noob)
Es muss auch in Unterverzeichnissen geaendert werden...

Es wuerde schon helfen ersteinmal alle eintraege zu aendern die mit
[\"] anfangen.

Es waere nett wenn mir jemand dabei helfen wuerde dieses Skript auszuformulieren.

Xanti
10.10.2005, 14:25
Wie gewünscht, der Einzeiler ;)



find . -type f -exec perl -pi -e '~s/(?<![\w_\-@#.])subdomain.domainname.org/neu-subdomain.domainname.org/g' {} \;


Gruss, Phorus

tr0nix
10.10.2005, 14:31
Die Perlloesung wird IMHO verlaesslicher sein da inline-editing nicht bei allen sed-Derivaten supportet ist (inline-editing = editieren direkt in der Datei ohne temporaere Datei zu erstellen). Ich denke das ist der -i Schalter (arbeite hauptsaechlich mit sed unter Solaris, dort isses bei Standard-SED auf Solaris 8 nicht moeglich inline zu arbeiten).

Wolfgang
10.10.2005, 14:51
Hallo ihr lieben,

der Einzeiler ist ja schon echt super.
Ich hab ein aehnliches Problem, aber ich glaube nicht das man es in eine Zeile packen kann.

Die Zeile...

perl -pi -e '~s|subdomain\.domainname\.org|neu-subdomain\.domainname\.org|' *

...wandelt mir meinen String wie gewuenscht um.
subdomain.domainname.org wird umbenannt in neu-subdomainname.org

Leider wird aber auch...
neusubdomain.domainname.org umbenannt in
neu-neusubdomainname.org

Und da ist der haken. Ich muss alle ascii zeichen ausklammern vor dem subdomain.domain.org jedoch steht vor dem subdomain.domain.org of ein " , / , : oder leerzeichen die erlaubt sein soll. Wobei wir beim dem anscheinend sehr beliebten Thema Regular Expressions waeren .

Soweit hab ich mich schon schlau gemacht
[^0-9a-zA-Z] vor subdomain.domain.org sollen verboten sein.
fuer Grep also [[:alnum:]]
Die restlichen moeglichen Zeichen die evtl zu erwarten waeren und eine Aenderung ausschliessen sollen:
- _ @ # .
[[:alnum]_-\@\#\.]

Also muss ich ein Shellskript schreiben.
Nur wie ? (ich bin totaler noob)
Es muss auch in Unterverzeichnissen geaendert werden...

Es wuerde schon helfen ersteinmal alle eintraege zu aendern die mit
[\"] anfangen.

Es waere nett wenn mir jemand dabei helfen wuerde dieses Skript auszuformulieren.

Hallo
Sorry, aber so recht klar ist mir nicht was du willst.
Erster Hinweis:
[\"] beschreibt die Zeichenklasse für zwei Zeichen! Matcht auf Backslash ( \ ) oder Dobblequota ( " ) , was du wahrscheinlich nicht willst.
In Zeichenklassen bleiben alle Zeichen unescapet als solche erhalten. Ausnahme ist nur ] und - ( was nicht am Ende stehen darf.)
Suchst du also nach einem String der mit " beginnt und mit einem weiteren " endet (also zwischen "bal fasel " steht, dann wäre das etwa so:
Um den ersten zwischen doppelten Anführungszeichen stehenden String rauszuschnedein:
~s/^["]([^"].*?)["].*/$1/g
Zweiter Hinweis:
Bring doch mal ein paar Beispieldaten und das entsprechen gewünschte.

[[:alnum:]_-@#.] Diese Zeichen sollen nicht ersetzt werden, wenn sie wo stehen?

Lass also mal ein paar Infos mehr sehen, dann kann ich eventuell helfen.
Gruß Wolfgang

Wolfgang
10.10.2005, 14:58
Wie gewünscht, der Einzeiler ;)



find . -type f -exec perl -pi -e '~s/(?<![\w_\-@#.])subdomain.domainname.org/neu-subdomain.domainname.org/g' {} \;


Gruss, Phorus

Ähm will ja nicht altklug sein, aber das matcht unter Umständen zu viel weg, (greedy-modus) ;)


find . -type f -exec perl -pi -e '~s/(?<![\w_\-@#.].*?)subdomain\.domainname\.org/neu-subdomain.domainname.org/g' {} \;

Auch könnte es wahrscheinlicher sein, dass noch ein \s vor der subdomain stehen muss ( muss aber nicht sein, auch wenn es wahrscheinlich ist) dann würde ich davor noch \b bringen.

Nur so als Gedankenspielerei
:D
Gruß Wolfgang
PS Der Punkt muss natürlich escapet werden.

Xanti
10.10.2005, 15:20
Ähm will ja nicht altklug sein, aber das matcht unter Umständen zu viel weg, (greedy-modus) ;)
...

Hast recht. Danke, wieder was gelernt :)

Gruss, Phorus

whitey
10.10.2005, 15:21
!w0w!

Mein lieber Herr Gesangsverein, in der Windowswelt haette ich dazu ein 350kb Tool mit Adware bekommen...
Vielen lieben Dank.
(Kannst du die Adware auch noch in diese Zeile haemmern ??? ;) )


Waere es vermessen zu fragen ob ich dabei noch was lernen darf ?

Mal sehen ob ich das richtig verstehe.
Also mit find . werden alle Dateien angefasst .... auch die in den Unterverzeichnissen.
Mit -type f wird sichergestellt das er keine Verzeichnisse selbst ausgibt, nur files.
-exec perl (perl ausfuehren zur weiterverarbeitung des Ergebnisses)
-pi (Ausgabe und inline editing mit backup da noch... )
-e (... extension folgt) (Ich weiss allerdings nicht was das -e nun exact bedeutet.)
'~s| stream -> pipe ? richtig ?
( Das ganze in Klammern, weil es eine Bedingung darstellt ?
?<![\w_ Zeichen ist nicht w oder _ (sehr nett, www kommt auch haeufig vor... )
\-@#. und auch nicht - @ # oder .
) Klammer zu ...
subdomain.domainname.org/neu-subdomain.domainname.org/g Da wird nun gearbeitet. Aber ich verstehe nicht ganz warum dort nun '/' verwendet werden statt Pipes '|'.
g' {} \ Damit weiss ich nun gar nix anzufangen...

EDITH sagt: Da nun andere noch schneller sind und ich noch Probleme mit meinen ersten Tests hatte, nehm ich ein bisschen von dem Lob zurueck... aber nur ein bisschen. Auf jeden Fall wuerd ich aber gern wissen was da passiert,... :think: ;)

whitey
10.10.2005, 15:38
Lass also mal ein paar Infos mehr sehen, dann kann ich eventuell helfen.
Gruß Wolfgang

Huhu Wolfgang,

danke fuer deine Hilfe und die Erklaerungen dazu.

Hier ein paar Beispiele:

vorher: http://subdomain.domainname.org
nachher: http://neu-subdomain.domainname.org

vorher: ich@subdomain.domainname.org
nachher: ich@neu-subdomain.domainname.org

vorher: <!-- ##subdomain.domainname.org
nachher: <!-- ##neu-subdomain.domainname.org

vorher: Hallo subdomain.domainname.org
nachher: Hallo neu-subdomain.domainname.org

vorher: "subdomain.domainname.org"
nachher: "neu-subdomain.domainname.org"

vorher: url='subdomain.domainname.org'
nachher: url='neu-subdomain.domainname.org'

vorher: www.domainname.org
nachher: www.domainname.org

vorher: "www.beispieldomain.domainname.org"
nachher: "www.beispieldomain.domainname.org"

vorher: subdomain domainname.org
nachher: subdomain domainname.org

Es gibt immerwieder Faelle in denen die subdomain nur als Beispiel genannt wird oder die Domain und Topleveldomain allein fuer sich stehen,...
Geaendert werden php Dateien in denen statische Links veraendert werden muessen.

whitey
10.10.2005, 15:49
Ich nochmal :(

Die zweite Variante von Wolfgang gibt bei mir folgende Fehlermeldung aus:


Variable length lookbehind not implemented in regex; marked by <-- HERE in m/(?<![\w_\-@#.].*?)subdomain\.domainname\.org <-- HERE / at -e line 1.

Wolfgang
10.10.2005, 16:30
Hallo
Also wenn domainname.org
ein feststehender konstanter String ist, suchen wir alles was vor diesem getrennt durch einen Punkt steht.
Dabei wird subdomain auf der linken seite von einem Nichtwortzeichen (\W) begrenzt.
Versuchen wir es mal.
ich schreibe das der Übersichthalber mal etwas anders.

for i in $( find /pfad -type f); do
perl -pi"bak" -e '~s!^ #Stringanfang
(.*?) #irgendetwas (non-greedy) steht in $1
([^\W])+? # gefolgt von keinem Wortzeichen steht in $2
(\w+[^.].*?) # gefolgt von subdomain wortzeichen bis zum punkt $3
\.(domainname\.org)+? #domainname.org steht in $4
(.*)$! #Rest bis zum Zeilenende $5
!$1$2neu-$3.$4$5!ixg' $i #gefangene Werte einsetzen auf $i anwenden
done


Die Optionen i -Nicht casesensitiv, g - global, x -extendet

Naja ungetestet und sicher noch nicht perfekt.
Ohne die Kommentare kann das alles Perlteil in eine Zeile, dann aber die Kommentare raus.

Gruß Wolfgang
Wer Fehler findet mag sie berichtigen, hab leider keine Zeit das jetzt noch zu testen, schau aber später nochmal rein

Wolfgang
10.10.2005, 16:41
Ich nochmal :(

Die zweite Variante von Wolfgang gibt bei mir folgende Fehlermeldung aus:


Variable length lookbehind not implemented in regex; marked by <-- HERE in m/(?<![\w_\-@#.].*?)subdomain\.domainname\.org <-- HERE / at -e line 1.

Ja klar, ich habe nur die von Phorus korrigiert und diesen Fehler nicht gesehen.
(?<!...) gibt es nicht, ist aber hier auch nicht nötig.
Der string funktioniert bei deiner Konstellation ohnehin nicht.
eher so ~s|(.*?\W+?)subdomain\.domainname\.org\b(.*)$|$1ne ue-subdomain.domainname\.org$2|ig

aber selbst der ist nicht perfekt.
Siehe mein anderes Posting.
Gruß Wolfgang

Xanti
10.10.2005, 17:38
Ähm will ja nicht altklug sein, aber das matcht unter Umständen zu viel weg, (greedy-modus) ;)

Ich hab auch nochmal ne Frage. Da lookbehind mit festen Stringlängen arbeitet (daher auch der Fehler bei ".*?"), sollte es garnicht zu endlosen Matchen kommen. perl fängt am Anfang des Strings an, schaut, ob das erste Zeichen in [\w_\-@#.] liegt und geht dann sofort dazu über, den nachfolgenden String auf Gleichheit mit "subdomain..." zu prüfen.

Korrigiere mich bitte, falls ich da falsch denke.

Gruss, Phorus

Wolfgang
10.10.2005, 20:14
Hallo
Dein Lookbehind matcht auf alles was (nicht):
Wortzeichen oder - oder # oder @ oder . gefolgt von subdomain gefolgt von . domain gefolgt von . gefolgt von org findet.
Dass der Punkt geschützt werden muss ist ja klar.
Kommt nun z.B. in subdomain ein Unterstrich, wird der nächste Punkt gefressen.
Deshalb mein Vorschlag mit dem non-greedy Modus, was natürlich so nicht zusammenpasst.
Aber ich hatte leider übersehen, dass du ja garnicht ersetzt, sondern nur matcht, deshalb würde das nichts in der Datei ändern.

cu Wolfgang
PS Ist subdomain hier ein fester String oder ist der variabel?
Wenn subdomain ein fester String ist, wird das natürlich viel einfacher.

whitey
11.10.2005, 08:44
Guten Morgen,

ja, subdomain ist ein fester String. Jedoch koennte die Subdomain

zb. nix.unixboard.de heissen, oder auch u-nix.unixboard.de heissen.
Daher will ich einige zeichen ausklammern. Sonst wuerde aus u-nix.unixboard.de ein u-neu-nix.unixboard.de ebenso die topleveldomain koennte variieren (de org net etc...).

Es waere toll wenn ihr mir euren einzeiler und auch deine Variante Wolfgang naeher erklaeren koenntet.

Wozu werden zB die geschweiften Klammern und der slash benoetigt ?
{} \;

Wolfgang
11.10.2005, 10:24
Hallo


Guten Morgen,

ja, subdomain ist ein fester String. Jedoch koennte die Subdomain

zb. nix.unixboard.de heissen, oder auch u-nix.unixboard.de heissen.
Daher will ich einige zeichen ausklammern. Sonst wuerde aus u-nix.unixboard.de ein u-neu-nix.unixboard.de ebenso die topleveldomain koennte variieren (de org net etc...).

Na dann wird das viel einfacher:

Zuerst eine Schleife, um alle Dateien zu erfassen, in denen ersetzt werden soll.

Variante 1:

find /rootpfad/ -type f -iname "*html" -exec echo {} \;

Find sucht alle Dateien die auf html enden, egal ob Html oder HTmL ( Option -iname).
Hinter dem -exec wird mit diesen Dateien ein Kommando ausgeführt. Hier beispielsweise mal echo, was nur die gefundenen Dateien ausgibt. Die {} repräsentieren dabei den von find gelieferten Dateinamen. Das \; schützt das Semikolon vor der Shell, die dieses sonst vor dem Befehl interpretieren würde.
-exec würde sonst den Befehl nicht erkennen. Probier es aus und schau dir mal man find an :rtfm:


Es waere toll wenn ihr mir euren einzeiler und auch deine Variante Wolfgang naeher erklaeren koenntet.

Wozu werden zB die geschweiften Klammern und der slash benoetigt ?
{} \;
siehe oben:

Eine andere Variante alle Dateien zu finden ist etwas in dieser Art:

Variante 2:
Das $(..) liefert hier eine Liste der Dateien, dessen Wert bei jedem Durchlauf von i angenommen wird.

for i in $(find /pfad -type f -iname "*html"); do
echo $i; done

Macht also das Gleiche wie oben, mit dem Unterschied dass die Prozesse nacheinander gestartet werden- was bei sehr vielen Dateien sinnvoll ist.
Auch eine Möglichkeit mit xargs ist dafür geeignet, besonders mit Leerzeichen in Dateinamen zu empfehlen!
siehe man xargs
Variante 3:

find /pfad -type f -iname "*html" -print0|xargs -0 -n1 echo

Was -print0 und xargs -0 macht, verrät dir die manpage ;)

So nun ersetzen wir einfach das echo von oben durch unseren Perleinzeiler.


Wenn du also jegliches Vorkommen von subdomain ändern willst, und subdomain ist dir als fester string bekannt, ist es ganz simpel.
Ich verwende mal Variante 2



for i in $(find /pfad -type f -iname "*html" ); do
perl -pi -e '~s!subdomain!neue-subdomain!ig' $i
done;


Wenn du aber die neu-subdomain teilweise schon in deinen Dateien stehen hast, und diese ausschließen willst geht der perl-Einzeiler so


perl -pi -e '~s!subdomain!neue-subdomain!ig unless($_=~/neue-subdomain/ig)' $i

Thats all folks :D
Gruß Wolfgang

whitey
11.10.2005, 10:50
Danke dir sehr Wolfgang.

Das war gut verstaendlich.
Jetzt werde ich ersteinmal mit all dem ein wenig herumspielen und ausprobieren ob ich alles richtig verstanden habe.
Ich denke euren Ausfuehrungen gibt es nichts mehr hinzuzufuegen, es sei denn ich stell mich zu bloed an :)

lg
whitey

Xanti
11.10.2005, 12:18
...
Kommt nun z.B. in subdomain ein Unterstrich, wird der nächste Punkt gefressen.
...

Hallo Wolfgang,

an die Sonderzeichen in der subdomain hab ich garnicht gedacht. Punkt für Dich.

Gruss, Phorus

p.s.: Danke, dass Du das Erklären übernommen hast.

Wolfgang
11.10.2005, 12:43
Hallo Wolfgang,

an die Sonderzeichen in der subdomain hab ich garnicht gedacht. Punkt für Dich.

Gruss, Phorus

p.s.: Danke, dass Du das Erklären übernommen hast.
Na aber Hallo
es geht doch garnicht um Punkte, sondern dass wir hier möglichst kompetent helfen.
Ich bin auch nicht fehlerfrei -oft betriebsblind - und erwarte dann auch korrigiert zu werden.
;)
In diesem sinne miteinander, nicht gegeneinander.
Denke nicht, dass wir uns etwas beweisen müssen.
Gruß Wolfgang

ub_proteus
11.10.2005, 12:48
:oldman
Wenn man ofter Zeichenketten in mehreren Dateien ersetzen will ist
doch eine Textverarbeitung mit der Option "Ersetze in Dateien"
sehr sinnvoll.

Habe selbst danach gesucht und auch welche für Linux gefunden und benutzt:
1.) "Cream" (Aus der Familie vi, vim,...)
2.) Kdevelop

Xanti
11.10.2005, 13:20
In diesem sinne miteinander, nicht gegeneinander.
Denke nicht, dass wir uns etwas beweisen müssen.
Gruß Wolfgang

Das hast Du falsch verstanden, es war nur ein plumper Versuch eines Kompliments ;)

Da ich Perl "by doing" lerne, bin ich über jeden Hinweis dankbar.


Wenn man ofter Zeichenketten in mehreren Dateien ersetzen will ist doch eine Textverarbeitung mit der Option "Ersetze in Dateien" sehr sinnvoll.

Das denke ich aber anders. Wenn man erstmal ein Skript geschrieben hat, ist das Modifizieren ziemlich einfach. Davon abgesehen wüsste ich nicht, wie man mit einem Editor alle Dateien in einem Verzeichnis (nebst Unterverzeichnissen) gleichzeitig bearbeiten kann. regular expressions kann man mit den meisten Editoren auch vergessen (gut, Bluefish kann die, vi, emacs wahrscheinlich auch).

Gruss Phorus

edit: Hmm, lesen muss man können. Vergesst meinen letzten Absatz :D

ub_proteus
11.10.2005, 13:38
Das denke ich aber anders. Wenn man erstmal ein Skript geschrieben hat, ist das Modifizieren ziemlich einfach.

Jedem seine Meinung. Dann wirst du wahrscheinlich auch statt der "Suche" Funktion in Textverarbeitungen deine Skripte benutzen?
Warum nicht ganz auf Textverarbeitungen verzichten? Zeichen lassen sich auch in der Kommandozeile einer Datei hinzufügen.



Davon abgesehen wüsste ich nicht, wie man mit einem Editor alle Dateien in einem Verzeichnis (nebst Unterverzeichnissen) gleichzeitig bearbeiten kann.
Gruss Phorus


Dann solltest du es einmal versuchen, nur so gewinnt man Erfahrung.
Tipp: ist sogar das Standardverhalten. :D

Xanti
11.10.2005, 13:51
Eine Minute vor Deinem Post hab ich meine Meinung revidiert :D

Es kommt halt immer auf den Nutzen an. Wenn ein File (ein Log-File zum Beispiel) automatisch geparst werden soll, wenn nur eine Shell zur Verfügung steht oder wenn man einfach zu faul ist (so wie ich), hundert verschiedene Syntaxe zu lernen -> dann sind Skripte nicht falsch.

Gruss, Phorus

p.s.: Editieren tu ich trotzdem mit meinem heissgeliebten Bluefish ;)

whitey
11.10.2005, 16:29
Schoene Grundsatzdiskussion :)

Wenn die Dateien nicht auf meinem Rechner liegen und sich auch schon mal ueber nacht aendern... (mehr werden oder weniger... ) dann bin ich froh das ich ueber die Shell mit einem einzeiler fix eingreifen kann.

Wenn ich lange rumtuefteln muss wuensch ich mir dann und wann auch eine GUI die mir das Ergebnis visualisiert.

Wolfgang
11.10.2005, 18:22
Hallo
Ein Texteditor ist im Normalfall dazu da Texte zu erstellen.
Um aber Texte nach einem bestimmten Muster in vielen Dateien zu verändern, sind diverse schnell abgeschossene Einzeiler ideal.

Um zum Beispiel in meiner /etc/fstab etwa alle hda1 zu hda5 zu machen,
habe ich viel schneller
perl -pi -e'~s/hda1/hda5/g' /etc/fstab
geschrieben, als ich erst vim starte, die Stelle suche , die Datei editiere und speichere. Ausserdem gehe ich sicher, auch alle Stellen erwischt zu haben.

Ich weiss, auch vim lässt sich per Makro automatisieren.

Ausserdem sind solche Einzeiler scriptfähig, was beim Automatisieren von Aufgaben unverzichtbar ist.

Der Vorteil ist aber noch größer, wenn ich auf einem Remotesystem per ssh eingelogt bin.
Nahezu jedes *nixoide System hat perl, sed, awk zur Verfügung.

Ich kann also sofort meine Aufgabe erledigen, ohne auf eine GUI oder bestimmte Software angewiesen zu sein.

Jeder nutzt das, womit er die Aufgabe am effizientesten lösen kann.
Für mich ist das gerade bei Textbearbeitung perl.
Bei den REGEXPR. weiss ich so, was ich nutzen kann was bei den verschiedenen Versionen von sed, grep und co nicht immer gleich ist.

Das meine 2¢ dazu
Gruß Wolfgang
PS Übrigens klassisches Beispiel, wo man ohne GUI eine Datei simpel editieren muss ist XFree86. Wenn der mal nicht mehr startet, stehen viele dumm da ohne Kate und co. wenigstens vim sollte man dann bedienen können.

Xanti
11.10.2005, 19:49
Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude ;)

ub_proteus
12.10.2005, 17:43
Die beiden Textverarbeitungen die "Suchen und Ersetzen in Dateien"
beherschen habe ich genannt um anderen eine Suche danach zu
ersparen.
Mehr nicht!

Genau soetwas habe ich gesucht um ein Projekt das ich für die
Windows Umgebung geschrieben hatte, bestehend aus etwa
100 Dateien Quellcode, nach Linux zu portieren.
Insbesondere wichtig war die Möglichkeit interaktiv, je nach
Fall, in bestimmten Dateien und an bestimmten Stellen
Ersetzungen durchzuführen oder auch nicht. Welche Fälle dabei
auftreten kann sich jeder vorstellen:
- unterschiedliche "Zwischenräume /Zeilenumbruch (Syntax korrekt aber Strings nicht gleich),
- Unterscheidung bereits geänderter Abschnitte/Dateien vs. zu Ändernden,
- gleiche Strings die aber unterschiedlich behandelt werden müsse,
- usw.
Das ein trivialer Einzeiler es hier nicht tut, weil eine
Beurteilung im Kontext erforderlich ist, dürfte klar sein.

Dennoch wäre ich mal gespannt wie eine solche Aufgabe mit einem
Einzeiler, von deren exklusiven Anhängern, in Angriff genommen
wird. :D

Es liegt mir fern etwas gegen shell-Befehle und gnu-Werkzeuge
zu sagen, ich nutze sie selbst ausgiebig, stellen sie doch eine
große Stärke der UNIX Betriebsysteme dar. Vor allem für
Administrationsaufgaben sind sie sehr nützlich.

Etwas seltsam ist es jedoch wenn man nach Nennung von zwei
Programmen von Anhänger der "ich mach alles in der Kommandozeile"
angegriffen wird als ob man ihnen ihr Lieblingsspielzeug
wegnehmen will. Keine Sorge. :headup:



Wolfgang_1
Hallo
Ein Texteditor ist im Normalfall dazu da Texte zu erstellen.

Super! Villeicht können wir es weiter einschränken auf die
Textgattung "Romane" oder deren Untergattung "Liebesromane".
Aus irgendeinem Grund ziehe ich es vor meinen Quellcode mit
einem Texteditor zu schreiben, obwohl das sicher auch mir sed,
awk, cat, perl, usw möglich ist.



Wolfgang_1
...ist XFree86. Wenn der mal nicht mehr startet, stehen viele
dumm da ohne Kate und co. wenigstens vim sollte man dann bedienen können.

Seit wann genau ist vim kein Texteditor mehr?


Wolfgang_1
Um zum Beispiel in meiner /etc/fstab ...,
habe ich viel schneller
perl -pi -e'~s/hda1/hda5/g' /etc/fstab

Jetzt habe ich beinahe Kaffee auf der Tastatur. :D

Xanti
12.10.2005, 18:34
Die beiden Textverarbeitungen die "Suchen und Ersetzen in Dateien"
beherschen habe ich genannt um anderen eine Suche danach zu
ersparen.
Mehr nicht!


Ja, und wir haben nur den Nutzen und den Sinn von Shell-Skripten genannt. Mehr nicht!



Genau soetwas habe ich gesucht um ein Projekt das ich für die
Windows Umgebung geschrieben hatte, bestehend aus etwa
100 Dateien Quellcode, nach Linux zu portieren.
Insbesondere wichtig war die Möglichkeit interaktiv, je nach
Fall, in bestimmten Dateien und an bestimmten Stellen
Ersetzungen durchzuführen oder auch nicht. Welche Fälle dabei
auftreten kann sich jeder vorstellen:
- unterschiedliche "Zwischenräume /Zeilenumbruch (Syntax korrekt aber Strings nicht gleich),
- Unterscheidung bereits geänderter Abschnitte/Dateien vs. zu Ändernden,
- gleiche Strings die aber unterschiedlich behandelt werden müsse,
- usw.
Das ein trivialer Einzeiler es hier nicht tut, weil eine
Beurteilung im Kontext erforderlich ist, dürfte klar sein.

Dennoch wäre ich mal gespannt wie eine solche Aufgabe mit einem
Einzeiler, von deren exklusiven Anhängern, in Angriff genommen
wird. :D


Völlig aus der Luft gegriffen. Nirgendswo oben im Thread, der übrigens im "Shell-Skripte"-Abschnitt des Forums steht, ging es um "interaktives" Ersetzen. Wo die Grenzen der Shell-Skripte sind: keine Angst, die kenn ich. Alle oben genannten Anfragen hatten ein nachvollziehbares und klar definiertes Suchschema und legen die Anwendung eines Shell-Skriptes nahe. Klar, dass man damit nicht unterscheiden kann zwischen Vogelbauer und dem Mann mit den dicken Kartoffeln. Das hat aber niemand behauptet.

Bei Deinem Beispiel versagen natürlich die Shellskripte. Genauso, wie Dein Editor bei der Aufgabe, "Suchen, Ersetzen und Kaffeekochen" versagen würde. ;)

Gruss Phorus

ub_proteus
12.10.2005, 19:40
Phorus

Ja, und wir haben nur den Nutzen und den Sinn von Shell-Skripten genannt. Mehr nicht!

Mit wir meinst du wohl dich und wolfgang_1.

Schade. Lesen muß man aber können.
Im Gegenteil: zumindest in den an mich gerichteten Antworten wurde kleinsektiererisch auf die Überlegenheit von Einzeilern gepocht. Von Shell-Skripten war gar nicht die Rede. Und selbst wenn war das ein schönes Beispiel über deren Grenzen.

Die Logik bleibt dabei auch im Keller. Keine Not darauf einzugehen, Beitrag steht ja noch da.



Phorus
Völlig aus der Luft gegriffen. Nirgendswo oben im Thread, der übrigens im "Shell-Skripte"-Abschnitt des Forums steht, ging es um "interaktives" Ersetzen.


Ziemlich schwach. Ebenfalls keine Not darauf einzugehen.



Phorus
Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude

Genau. Viel Erfolg.

Xanti
12.10.2005, 21:35
...
Schade. Lesen muß man aber können.


Ist bestimmt kein Nachteil. Ich weise mal auf meinen Post #32, denn da kann man lesen:



Eine Minute vor Deinem Post hab ich meine Meinung revidiert :D
...

Im Post #30 findet man dann auch


...
edit: Hmm, lesen muss man können. Vergesst meinen letzten Absatz :D


Also der Fehler des falsch Lesens lag eindeutig bei mir. Als das ganze dann weiterlief, dachte ich mir: Egal, wird vielleicht 'ne interessante Diskussion. Leider artet es mittlerweile derart aus, dass ichs dem Mod nicht verübeln könnte, wenn er den Thread in den Sandkasten verschiebt. Um dem ganzen einen Riegel vorzuschieben, würde ich ein Ende vorschlagen, auch wenn ich Deine schnippischen Kommentare, entstanden wahrscheinlich aus einem persönlich angegriffen fühlen, belustigend finde.



Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude


Der Satz ist in lustiger Runde aus einer Weinlaune heraus entstanden und ist (selbst)ironisch gemeint. Aber fühl Dich ruhig bestätigt.

Wolfgang
13.10.2005, 08:27
Hallo
Mir sind derartige von verletzter Eitelkeit strotzende Postings wie das von ub_proteus
zu unwichtig, um darauf näher einzugehen.
Unklar wo und warum sich dieser Bub verletzt fühlt.

Aber hier mein einziges und letztes direktes Posting dazu:

@ub_proteus
Geantwortet habe ich jedenfalls nicht auf dein Posting, lediglich meine Meinung zu
Einzeilern und deren Nützlichkeit insbesondere im Zusammenhang mit administrativen Aufgaben.

Hallo ub_proteus wir sind hier im Forum Shell-Skripte.

Jedenfalls kann ich nirgends lesen, behauptet zu haben alles über Einzeiler zu erledigen.
Quellcode (ob für Wintendo oder nicht) ist letztendlich auch nur Text, den auch ich mit vi erstelle. Etwas anderes habe ich nirgendwo behauptet.

Vermutlich steckt bei dir eine latente Angst vor der Konsole dahinter.
Anders ist es nicht erklärbar wie du auf so obskure Schlussfolgerungen und Behauptungen kommst, ja dich überhaupt angegriffen fühlst.

Also nimm deine Programme für was du willst, ich jedenfalls spüre keine Lust zu missionieren.

Ich verwende meine Werkzeuge, und helfe wenn ich diesbezüglich gefragt werde - und kann. Rechtfertigen muss ich das vor Niemanden.

Nochmal: Hier ist ein Forum für Shell-Skripte auf *nixoiden Systemen!

Wenn du deine Programme anbieten willst, tu das im Bereich Anwendungen.

So, nun komm wieder runter, atme tief durch und lies noch mal in alller Ruhe was hier steht. Dann wird dir eventuell bewusst, dass du hier einen Kleinkrieg anfangen wolltest, den ausser dir keiner hier will.

Gruß Wolfgang

whitey
16.11.2005, 09:17
Schade das die Diskussion so abgeschweift ist.
Ich wollte euch noch mitteilen das ich Erfolg hatte dank eurer Ideen zur Loesung und was mir noch wichtiger ist ein bisschen was lernen konnte.

Solche Shell Scripte und Einzeiler sind, wenn sie dazu noch gut erklaert werden, fuer einen Anfaenger wie mich sehr sehr nuetzlich.

Xanti
16.11.2005, 10:02
...Solche Shell Scripte und Einzeiler sind, wenn sie dazu noch gut erklaert werden, fuer einen Anfaenger wie mich sehr sehr nuetzlich.

Pscht, aber nicht ub_proteus erzählen *scnr* :D

Gruss, Phorus