sed/find Problem

Post Reply
Message
Author
Kurt

sed/find Problem

#1 Post by Kurt »

Hallo

Ich habe diverse HTML-Dateien in verschiedenen Unterordnern verteilt. Ich möchte nun bei allen Dateien den Ausdruck asdf durch fdsa (bloss ein Beispiel) ersetzen. Dazu habe ich folgendes ausprobiert:

[kurt@earth html]$ find ./ * -exec sed -n -e s/asdf/fdsa/g;
find: missing argument to `-exec'

Was stimmt an meinen Ausdruck nicht bzw. wie kann ich diese Ersetzung realisieren?

Vielen Dank,
Kurt

ratte

Re: sed/find Problem

#2 Post by ratte »

du must das sed argument in anfuehrungszeichen setzen. und p fehlt auch.

ob's dadurch das macht, was du willst, bezweifle ich aber irgendwie :)

$ find ./ * -exec sed -n -e "s/asdf/fdsa/pg"

ratte

Kurt

Re: sed/find Problem

#3 Post by Kurt »

Hi Ratte

Danke für deine Antwort, es funktioniert aber leider immernoch nicht:

[kurt@earth html]$ find ./ * -exec sed -n -e "s/asdf/fdsa/pg"
find: missing argument to `-exec'

Und was meinst du mit "ob's dadurch das macht, was du willst, bezweifle ich aber irgendwie :)"? Verfolge ich einen falschen Lösungsansatz?

Vielen Dank für jede Antwort,
Kurt

ratte

Re: sed/find Problem

#4 Post by ratte »

weshalb dein bisheriger ansatz niemals irgendein file umbenennen wird, liegt zb. daran, dass du den `mv` befehl noch gar nicht eingebaut hast.

find ./ * -print | sed -n -e "s/asdf/fdsa/pg"

gibt nur die sed modifikation auf der konsole aus. und wie soll's jetzt weitergehen?

nun, ich habe dir da was gebastelt:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
$ for I in `find ./ -name "*.html" -print` ; do echo $I; mv $I `echo $I | sed -n -e 's/asdf/fdsa/gp'`;done
</font><hr></pre></blockquote>

das sollte _genau_ das machen, was du in deinem ersten posting erfragt hast. files, die von sed nicht gematcht werden erzeugen kein zweites mv argument, weswegen dieser befehl sich dann mit einer fehlermeldung meldet aber nichts macht.
alle files, die sed matchen kann erzeugen ein mv befehl mit zwei argumenten, di. ./pfad/file_orignal und ./pfad/file_neu
du kannst ja mal den mv befehl von echo"" einschliessen, dann wird der befehl nur auf stdout ausgeworfen und es erfolgt keine aktion.

natuerlich solltest du erst damit rumexperimentieren, und zwar _nicht_ an den orignaldateien, sondern an einer kopie:

# cp -avr /mein/verzeichnis /mein/testverzeichnis

ratte

Jochen

Re: sed/find Problem

#5 Post by Jochen »

Hi,

wenn ihr mit der Option "-n" und "s///p" arbeitet, werden <i>nur</i> die Zeilen ausgegeben, in denen der Treffer vorkommt. Alle anderen werden unterdrückt...

Meine Lösung für solche Problemfälle ist immer<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">find . -name "*.html -print0 | xargs -0 perl -p -i.orig -e 's/asdf/fdsa/g'</font><hr></pre></blockquote>find schaufelt alle Dateinamen an xargs. Der baut ein perl-Kommando mit den o.a. Optionen und sämtlichen übergebenen Dateinamen zusammen (und beachtet dabei auch die maximal mögliche Anzahl von Argumenten). perl wird durch die Option -p dazu gebracht, wie sed zu funktionieren, nur dass es durch die Option -i ein Inline-Editing macht. Zur Sicherheit werden alle Dateien, die angepackt werden, vorher kopiert mit der zusäzlichen Endung ".orig".

Jochen

ratte

Re: sed/find Problem

#6 Post by ratte »

perl ist ja eigentlich auch meine lieblingssprache fuer schnell_mal_eben_problem_loesen, aber so ein file problem sollte, finde ich, mit bashmitteln alleine geloest werden.
obwohl das ist natuerlich ansichts- oder systemportabiliaets-sache :)

ratte

Jochen

Re: sed/find Problem

#7 Post by Jochen »

Witzig - normalerweise bastel ich eher Shellskripte und sehr viel perl beherrsche ich gar nicht. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Aber dieses Skriptchen finde ich so praktisch, dass ich es fest in meinen Werkzeugkasten übernommen habe. Auch in der Hoffnung, deswegen mal wieder etwas mehr perl zu lernen...

Jochen

Post Reply