Sie sind nicht angemeldet.

1

02.01.2004, 16:39

vi Befehl auf Dateien anwenden

wie kann ich einen vi Befehl auf alle Dateien in einem Verzeichnis anwenden, ohne dabei immer wieder alles per "Hand" einzugeben?

(hier

:%s/TextAlt/TextNeu

dh es soll in allen Dateinen der TextAlt durch TextNeu ersetzt werden)
Hallo

mwanaheri

Fortgeschrittener

  • »mwanaheri« ist männlich

Beiträge: 359

Wohnort: NRW

Beruf: Linguist, Software-Developer

  • Nachricht senden

2

02.01.2004, 22:38

RE: vi Befehl auf Dateien anwenden

wäre das nicht eher eine Aufgabe für sed oder awk?
Computer und Konjunktive gehören nicht zusammen.

3

03.01.2004, 13:02

ja wahrscheinlich schon
wenn ich in sed eingebe

sed 's/alterTxt/neuerTxt/g' dateiA
bekomme ich es rausgeknallt

sed 's/alterTxt/neuerTxt/g' dateiA > dateiB
bekomme ich es in dateiB

sed 's/alterTxt/neuerTxt/g' dateiA > dateiA
wird der Inhalt der Datei gelöscht, warum? (wenn ich 'w datei' nehme ist der Inhalt auch weg)


des weiteren wüsste ich nicht wie ich mehrere Dateien mit einem Befehl verändern könnte. Mit
sed 's/alterTxt/neuerTxt/g' datei* > ??
Hallo

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Villain« (03.01.2004, 14:31)


mwanaheri

Fortgeschrittener

  • »mwanaheri« ist männlich

Beiträge: 359

Wohnort: NRW

Beruf: Linguist, Software-Developer

  • Nachricht senden

4

05.01.2004, 14:33

Zitat

Original von Villain
ja wahrscheinlich schon
wenn ich in sed eingebe

sed 's/alterTxt/neuerTxt/g' dateiA
bekomme ich es rausgeknallt

sed 's/alterTxt/neuerTxt/g' dateiA > dateiB
bekomme ich es in dateiB

sed 's/alterTxt/neuerTxt/g' dateiA > dateiA
wird der Inhalt der Datei gelöscht, warum? (wenn ich 'w datei' nehme ist der Inhalt auch weg)


des weiteren wüsste ich nicht wie ich mehrere Dateien mit einem Befehl verändern könnte. Mit
sed 's/alterTxt/neuerTxt/g' datei* > ??


wie wäre es mit
for datei in `ls <muster>` do
sed 's/altertxt/neuerTxt/g $datei > `basename $datei`.neu
done
?
dann kann man alles überprüfen und mit
for datei in `ls *.neu` do
mv $datei `basename $datei .neu`
done
die alten Dateien überschreiben.
Sollte so klappen
Computer und Konjunktive gehören nicht zusammen.

Chucky the Devil

Pianist im Puff

  • »Chucky the Devil« ist männlich

Beiträge: 1 636

Wohnort: Koeln

Beruf: Network Architect

  • Nachricht senden

5

05.01.2004, 15:15

Zitat

Original von mwanaheri
wie wäre es mit
for datei in `ls <muster>` do
sed 's/altertxt/neuerTxt/g $datei > `basename $datei`.neu
done

Das "ls <muster>" kannste Dir sparen...

Quellcode

1
for i in *.txt do; mv $i $i.old && sed 's/altertxt/neuerTxt/g' $i.old > $i && rm -f $i.old; done

Sollte effektiver sein, da der Dateiname der gleiche bleibt und nicht $dateiname.neu wird.

mwanaheri

Fortgeschrittener

  • »mwanaheri« ist männlich

Beiträge: 359

Wohnort: NRW

Beruf: Linguist, Software-Developer

  • Nachricht senden

6

05.01.2004, 15:28

Stimmt, ist deutlich eleganter.
Computer und Konjunktive gehören nicht zusammen.

Neo23X0

Fortgeschrittener

  • »Neo23X0« ist männlich

Beiträge: 322

Beruf: IT Consultant

  • Nachricht senden

7

05.01.2004, 21:49

mit awk

Ich mag "awk" lieber. Daher muss ich auch meinen Senf dazugeben. :blume2:

awk '{sub(/vorher/,"nachher"); print}' input1.txt input2.txt input3.txt > output.txt

im oberen Beispiel müssen die Dateien noch einzeln agegeben werden. Man kann aber auch über Wildcarts gehen.

awk '{sub(/vorher/,"nachher"); print}' *.txt > output.txt

wandelt alle *.txt's um und schreibt sie nach output.txt.


Bye

---

guru@linux:~> who I grep -i blonde I talk; cd ~;
wine; talk; touch; unzip; touch; strip; gasp; finger;
mount; fsck; more; yes; gasp; umount; make clean; sleep;

tierralinda.de

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Neo23X0« (05.01.2004, 22:18)


Chucky the Devil

Pianist im Puff

  • »Chucky the Devil« ist männlich

Beiträge: 1 636

Wohnort: Koeln

Beruf: Network Architect

  • Nachricht senden

8

05.01.2004, 22:21

Dann wollen wir Perl mal auch nich fehlen lassen...

Quellcode

1
cat Dateiname | perl -pe 's/altertext/neuertext/g'>Dateiname

oder in der Schleife...

Quellcode

1
2
3
4
for i in *.txt
do
   cat $i | perl -pe 's/altertext/neuertext/g' > $i
done

Neo23X0

Fortgeschrittener

  • »Neo23X0« ist männlich

Beiträge: 322

Beruf: IT Consultant

  • Nachricht senden

9

05.01.2004, 22:55

FETT

:applaus:

guru@linux:~> who I grep -i blonde I talk; cd ~;
wine; talk; touch; unzip; touch; strip; gasp; finger;
mount; fsck; more; yes; gasp; umount; make clean; sleep;

tierralinda.de

mwanaheri

Fortgeschrittener

  • »mwanaheri« ist männlich

Beiträge: 359

Wohnort: NRW

Beruf: Linguist, Software-Developer

  • Nachricht senden

10

05.01.2004, 23:44

Zitat

Original von Chucky the Devil
Dann wollen wir Perl mal auch nich fehlen lassen...


Ok, dann aber auch Ruby nicht vergessen:
cat dateiname | ruby -p -e '$_.gsub!("altesMuster","neuesMuster")' > Dateiname

Ach, so viele Möglichkeiten...

Merkt's jemand? ich kann mich schlecht an Kurzversionen von Befehlen gewöhnen ;-)
Computer und Konjunktive gehören nicht zusammen.

11

06.01.2004, 00:39

ich danke euch

ach ja:

Zitat

for i in *.txt do mv $i $i.old && sed 's/altertxt/neuerTxt/g' $i.old > $i && rm -f $i.old done


die Strichpunkte ";" waren falsch
Hallo

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Villain« (13.01.2004, 14:23)


Thema bewerten