Sie sind nicht angemeldet.

1

31.05.2009, 11:04

[gelöst] Bash Shell Script

Hallo,

ich habe eine Textdatei, die ich mittels Bash-Script ändern möchte.

Die Testdatei besteht aus mehreren Zeilen.
Bei einigen Zeilen findet sich am Ende ein ; gefolgt von weiterem Text.

Ich möchte alles incl. dem ; aus der Zeile entfernt haben...auch das ; und das Leerzeichen, welches sich vor dem ; befindet.

Beispiel:

abcdefgh ijklmnop qrstuvwxyz ; weiterer Text

Ergebnis:

abcdefgh ijklmnop qrstuvwxyz


Wie kann ich das denn mittels sed machen?

Danke

Der Tom

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Tommyland78« (31.05.2009, 11:07)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

31.05.2009, 11:23

RE: Bash Shell Script

sed 's/ ;.*$//g' dateiname
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

31.05.2009, 11:56

Sehr gut! Funktioniert...

Eins noch... wie entferne ich 2 Leerzeichen und ersetze es mit nur einem Leerzeichen?

Es ist jedoch so, dass dies mitten im Text vorkommen kann.

Also
Beispiel
abcde fghijk##lmno

# Ersetzt das Leerzeichen in dem Beispiel, da der Editor keine 2 Leerzeichen hintereinander zulässt

Ergebnis
abcde fghijk#lmno

Der Tom

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tommyland78« (31.05.2009, 11:57)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

31.05.2009, 12:06

sed 's/ \{2,\}/ /g' <dateiname>

es werden zwei oder mehr zusammenhängende leerzeichen durch ein leerzeichen ersetzt.
s/ausdruck1/ausdruck2/g ersetzt in jeder zeile den ausdruck1 durch den ausdruck2, auch wenn er mehrmals in der zeile vorkommt (g).
der ausdruck ausdruck1 kann auch ein regulärer ausdruck ein. hier ist es _leerzeichen_\{2,\} und das bedeutet, dass das leerzeichen von einem wiederholungsoperator gefolgt wird {2} bedeutet genau zwei mal, {2,} bedeutet mindestens 2 und {2,5} bedeutet dass sich das zeichen 2 bis 5 mal wiederholen darf. die \ quoten die klammern {}um sie vor der shell zu verbergen.
dokumentationen lesen!!!
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

31.05.2009, 12:51

bitte, gern geschehen :)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

7

31.05.2009, 16:30

Bei einfachen Quotes (also Apostrophen) muss man doch eigentlich nix escapen, oder wird eine exzentrische Shell benutzt?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

8

31.05.2009, 17:26

Zitat

Original von oziris
Bei einfachen Quotes (also Apostrophen) muss man doch eigentlich nix escapen, oder wird eine exzentrische Shell benutzt?


ja, die shell von sed =D

normalerweise muss in sed-scripten die sonderbedeutung der metazeichen mit dem backslash abgeschaltet werden, damit es als normales zeichen behandelt wird. bei aufzählungen (geschweifte klammern) und zusammenfassungen (runde klammern) muss der backslash vor die öffnende und schliessende klammer um sie als sonderzeichen zu kennzeichnen, denn sie sind ja keine metazeichen. etwas wirr ......
wenn du zb in sed 's/ \{2,\}/ /g' <dateiname> die backslash weglässt, dann werden die klammern als normale zeichen behandelt und der reguläre ausdruck meldet einen treffer, wenn der stream die zeichenkombination {2,} enthält.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

9

31.05.2009, 18:08

Ach so meinst Du das. Du escapest also nicht vor der Shell, in der sed gestartet wird, sondern vor sed selbt, damit bestimmte Zeichen mit spezieller Bedeutung im Suchausdruck überhaupt erst interpretiert werden. Jetzt verstehe ich endlich, warum ich sed nicht verstehe :crazy:

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

10

31.05.2009, 18:35

Zitat

Original von oziris
Jetzt verstehe ich endlich, warum ich sed nicht verstehe :crazy:


:() ja genau.
vielleicht kann uns ja strcat bei gelegenheit aufklärung verschaffen. für dieses "eigenartige" verhalten gibt es sicherlich einen sinnvollen grund.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

11

31.05.2009, 23:51

Was fuer ein eigenartiges Verhalten? Ich hab nix gelesen was sich nicht von selbst erklaert.
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

12

01.06.2009, 00:40

naja, das für mich "eigenartige" verhalten besteht darin, dass die sonderbedeutung normalerweise durch den backslash aufgehoben wird und bei den klammern quasi eingeschaltet wird.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

13

01.06.2009, 03:26

Ist nicht wirklich eigenartig. Die Shell startet sed(1) und wuerde ohne das Escapen die Regex so abarbeiten, als waer sie fuer die Shell und nicht fuer sed(1) gedacht was logischerweise nicht unbedingt funktionieren wuerde.
Ist letztendlich das gleiche Prinzip wie mit dem Escapen von Variablen; wenn man Hochkommanta (double quotes) verwendet, werden sie von der Shell abgearbeitet und expandiert (is aber ein bloedes Beispiel eigentlich, weil das bei Single quotes sind der Fall ist).
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

14

01.06.2009, 08:35

eben, es sind ja single-quotes. die aufrufende shell muss den parameter also unangetastet lassen und ihn so an sed übergeben. das ist auch der fall, denn ohne backslash sucht sed ja nach dem vorkommen des strings ' {2,}', die klammer wurde also wie erwartet nicht durch die aufrufende shell expandiert, hat für sed aber auch keinerlei sonderbedeutung.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

15

26.06.2009, 21:49

noch eine Frage

Hallo...
da bin ich wieder...mit einer neuen Frage :-)

Ich habe einen Text den ich wieder bearbeiten möchte...mit Vorliebe wieder sed

| verschiedene Zeichen | verschiedene Zeichen | Text den ich benötige

Also am Anfang jeder Zeile gibt es unterschiedlich lange Zeichen, welche in | gepackt sind.
Nach dem 3ten | benötige ich den Text...alles davor incl. dem | selbst kann weg.

Beispiel:

| 123 |ab432| Das hier brauche ich
|awe| 43dd | Das hier brauche ich
|rfg |rfrf |Das hier brauch ich

Wie stelle ich das an?

Danke

Der Tom

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

16

26.06.2009, 21:56

RE: noch eine Frage

das macht man am schnellsten mit cut.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

17

26.06.2009, 21:57

Siehe "man cut" oder "info coreutils cut".
Beispiel:

Quellcode

1
cut -d \| -f 4 dateiname

18

26.06.2009, 21:57

Ok...cut geht auch...wie?

Der Tom

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

19

27.06.2009, 09:21

hat oziris doch geschrieben, wie das geht.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Thema bewerten