Kleines sed-Problem

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von upperlimit, 31.07.2006.

  1. #1 upperlimit, 31.07.2006
    upperlimit

    upperlimit Jungspund

    Dabei seit:
    11.04.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo,

    ich bin gerade dabei, meine sed-Kenntnisse aufzubessern. Dabei stiess ich auf folgendes Problem.

    In einer (cpp)-Datei waren alle Kommentare mit // eingeleitet, bis auf eine einzelne Zeile. Um Konsistenz in dieser Quelle herzustellen, benutzte ich nun sed, um aus der //-Zeile eine /*...*/-Zeile zu machen, also beispielsweise

    // Transformation method

    wird zu

    /* Transformation method */

    Dieses erreichte ich mit folgender sed-Zeile:

    sed '{152s/\/\//\/\*/;152s/$/\*\//}' datei
    (Die Idee, sed zu benutzen, waehlte ich, da ich noch andere Dateien gleichen Typs derart behandeln muss.)

    Das Problem ist nun, dass ich fuer die Zukunft nicht sicher sein kann, dass dieser //-Kommentar ausschliesslich in Zeile 152 vorkommen kann (es arbeiten noch andere Kollegen an dieser und aehnlichen Dateien).

    Daher ist meine Frage, wie ich den sed-Aufruf verallgemeinern kann, sodass jeder Zeile, die mit // beginnt, das // durch /* ersetzt wird und am Ende dieser Zeile ein */ angehaengt wird (ohne die genaue Zeilennummer zu kennen).

    Vielen Dank und Gruesse,
    upperlimit
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Xanti, 31.07.2006
    Zuletzt bearbeitet: 31.07.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Muss es unbedingt sed sein?

    Gruss, Xanti

    edit: Hier eine Lösung mit perl:

    Code:
    perl -pi -e 'if (/\/\//) {s!//!/*!; s!$!*/!}' file
    
     
  4. #3 upperlimit, 31.07.2006
    upperlimit

    upperlimit Jungspund

    Dabei seit:
    11.04.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo Xanti,

    muss nicht, aber ein perl-Einzeiler erhoeht nun nicht gerade meine Kenntnisse ueber sed.:rolleyes:

    Dennoch, Danke fuer Deine schnelle Antwort.

    Gruss,
    upperlimit
     
  5. #4 Wolfgang, 31.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Code:
    $ cat test
    //test1
    test2
    //test3
    
    $ sed -e '/^\/\//s!^//\(.*\)$!/*\1*/!g' test
    /*test1*/
    test2
    /*test3*/
    
    
    ;)
    Gruß Wolfgang
     
  6. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Code:
    sed -e '/\/\//s/\/\//\/*/;/\/\*/s/$/*\//' file
    
    edit: Ups, Wolfgang war schneller. Egal :)
     
  7. #6 upperlimit, 31.07.2006
    upperlimit

    upperlimit Jungspund

    Dabei seit:
    11.04.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo,

    danke nochmals fuer die Antworten.

    Allerdings musste ich feststellen, dass die Loesung von Wolfgang mein Problem nicht geloest hat; funktionieren tut nur der Code von Xanti (Warum?)

    upperlimit
     
  8. #7 Xanti, 31.07.2006
    Zuletzt bearbeitet: 31.07.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Das kommt wahrscheinlich auf das sed und Dein OS an. Kommen Fehlermeldungen? Diese bitte auch angeben.

    Bei mir funktioniert übrigens Wolfgangs Lösung.

    Noch mal zum Verständnis:

    Wolfgang testet auf //, merkt sich den Rest der Zeile (in \1) und ersetzt diese Zeile dann durch das Gemerkte, eingerahmt in /* und */.

    Ich geh da trivialer ran. Ich teste erst auf //, ersetze dieses durch /* und teste anschliessend dieselbe Zeile auf /* und ersetze dann das Zeilenende durch */. Dies ist umständlich, leider kenn ich keine Gruppierung in sed, damit nur einmal getestet wird. Im Sinne von:

    Code:
    /\/\//{s/\/\//\/*/;s/$/*\//}
    
    Vielleicht weiss Wolfgang, wie man in sed Befehle gruppiert.

    edit: Vielleicht kommt Dein sed nicht mit "s!..!..!" klar. *vermut*
     
  9. #8 Wolfgang, 31.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Wenn Leerzeichen oder tab davor und nachfolgende // in der Zeile ignoriert werden sollen, dann ist folgendes genauer.
    Code:
    $ cat test
    //test1
    test2
    //test3
    /test4
     //test5
     test6/
     test7//
    $ sed -e 's!^[ \t]*//\(.*\)$!/*\1*/!g' test
    /*test1*/
    test2
    /*test3*/
    /test4
    /*test5*/
     test6/
     test7//
    
    Gruß Wolfgang
     
  10. #9 upperlimit, 31.07.2006
    upperlimit

    upperlimit Jungspund

    Dabei seit:
    11.04.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Das ist es, Wolfgang !

    Ich habe eben erst festgestellt, dass mir die Loesung von Xanti am Ende jeder Zeile die mit einem /* beginnt, ein zusaetzliches */ an das Ende dieser Zeile hinzufuegt, also

    // Transformation method

    wird zu

    /* Transformation method */ ,
    aber

    } /* end mdlOutput */

    wird zu

    } /* end mdlOutput */*/ .

    upperlimit
     
  11. #10 Wolfgang, 31.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Sorry, hab die Beiträge zwischendurch nicht gesehen, und schon abgedrückt. ;)

    Genau so geht es.:)
    In meinem ersten Beitrag matche ich auf // am Beginn der Zeile.
    Wenn erfüllt, ersetze ich alles was nach den // kommt mit /*<gefunden>*/

    Wenn dein sed ! nicht als Begrenzer versteht, dann nimm / und escape die Slash.
    Code:
    $ sed -e 's/^[ \t]*\/\/\(.*\)$/\/*\1*\//g' test
    Gruß Wolfgang
     
  12. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Stimmt, das hab ich nicht berücksichtigt. Wenn man die Substitutionen vertauscht, sollte es gehen

    Code:
    sed -e '/\/\//s!$!*/!;/\/\//s!//!/*!' file
    Bei mir nicht: ?(

    Code:
    [test]$ sed -e '/\/\//{s!$!*/!;s!//!/*!}' file
    sed: 1: "/\/\//{s!$!*/!;s!//!/*!}
    ": bad flag in substitute command: '}'
    
    OS ist FreeBSD 6.1

    Gruss, Xanti
     
  13. #12 upperlimit, 31.07.2006
    upperlimit

    upperlimit Jungspund

    Dabei seit:
    11.04.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Bei mir geht es jetzt auch mit

    sed -e '/\/\//s/$/*\//;/\/\//s/\/\//\/*/' file

    einziger (sichtbarer) Unterschied zur Loesung von Wolfgang: die relevante Zeile

    /* Transformation method */

    wird nicht mehr eingerueckt (bevorzugt).

    Gruss, upperlimit
     
  14. #13 Wolfgang, 01.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Bei mir nicht: ?(
    Sorry, habe kein FreeBSD hier zum Testen.
    Aber hab mal nachgesehen und folgendes gefunden:
    Quelle
    IMHO solltest du die Semikola einfach durch Leerzeichen ersetzen.
    Teste mal, ob das so geht.

    Gruß Wolfgang
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hmm, geht leider auch nicht.

    Code:
    [test]$ sed -e '/\/\//{ s!$!*/! s!//!/*! }' file
    sed: 1: "/\/\//{ s!$!*/! s!//!/* ...": bad flag in substitute command: 's'
    
    Geht es unter Linux?

    Gruss, Xanti
     
  17. #15 Wolfgang, 01.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Nein latürnich nicht. ;)
    Ich denke aber, dass es an deiner Version von sed liegt.

    Was hast du für eine Version, und was steht in deiner Manpage zu Function-list?
    Eventuell geht das nur mit der Option -f Scriptname -> also aus einem Sedscript heraus mit Newline. ?!

    Mit *BSD habe ich keine Erfahrung.

    Gruß Wolfgang
     
Thema:

Kleines sed-Problem

Die Seite wird geladen...

Kleines sed-Problem - Ähnliche Themen

  1. Suche kleines Live OS

    Suche kleines Live OS: Hallo, Ich suche ein kleines Live OS um zu sehen ob der Prozessor hochtaktet. Wie ist das zu realisieren? Hintergrund: Bei einem Dell Vostro...
  2. WRTnode: kleines Entwicklerboard mit WiFi und OpenWRT

    WRTnode: kleines Entwicklerboard mit WiFi und OpenWRT: Die Entwickler des WRTNode haben in China eine erste Beta-Version ihres preiswerten Entwicklerboards verkauft. Der WRTnode ist ein winziger...
  3. Android 4.3 - kleines Update mit interessanten Funktionen

    Android 4.3 - kleines Update mit interessanten Funktionen: Am 24.7. lud Googles Android-Chef Sundar Pichai zu einem Presse-Frühstück in New York, bei dem unter anderem auch Android 4.3 »Jelly Bean«...
  4. OLinuXino A13: kleiner Rechner für kleines Geld

    OLinuXino A13: kleiner Rechner für kleines Geld: Der bulgarische Elektronikhersteller Olimex bietet mit dem OLinuXino A13 einen kleinformatiges Motherboard an, das für viele Basteleien und...
  5. A13-OLinuXino: kleiner Rechner für kleines Geld

    A13-OLinuXino: kleiner Rechner für kleines Geld: Der bulgarische Elektronikhersteller Olimex bietet mit dem OLinuXino A13 einen kleinformatiges Motherboard an, das für viele Basteleien und...