sed: Text mit einzelnen Hochkommata ersetzen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von nfidia, 06.03.2009.

  1. #1 nfidia, 06.03.2009
    Zuletzt bearbeitet: 06.03.2009
    nfidia

    nfidia Jungspund

    Dabei seit:
    06.03.2009
    Beiträge:
    19
    Zustimmungen:
    0
    Hi,

    das folgende möchte ich unter cygwin mit der bash machen:

    Der Originaltext stammt aus einer Mediawiki-Seite. Es handelt sich um Text, der im Wiki kursiv dargestellt wird. Die Wiki-Formatierung hierfür sieht so aus:

    ''Text''​

    Bitte beachten: bei den Zeichen vor hinter "Text" handelt es sich um jeweils zwei einzelne Hochkommata.

    Wie kann ich diese zwei einzelnen Hochkommata mit sed ersetzen?

    Wenn ich schreibe

    sed 's/''Text1''/Text2/g' <Datei1> > <Datei2>​

    dann findet sed nichts in <Datei1>

    Mit dem Befehl

    sed 's/\'\'Text1\'\'/Text2/g' <Datei1> > <Datei2>​

    klappt das auch nicht.

    Hat jemand vielleicht eine Idee?
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Muss hier einen Dummy-Text reinschreiben, weil ich die "Abonniere Threads"-Funktion nicht aktiviert hatte, als ich meinen ersten Beitrag hier schrieb. Jetzt ist diese Funktion in meinem Profil aktiviert.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Hat nicht geklappt mit der nachträglichen Abonnierung meines eigenen Threads ?(
     
  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 Gott_in_schwarz, 06.03.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Denk mal nach (oder schau genau hin). Dein Problem hat nichts mit sed, sondern mit shell quoting zu tun. Deinem zweiten Beispiel fehlt sogar ein abschließendes Singlequote. (Das liegt daran, dass man in bash single-quotes nichts escapen kann.)

    Code:
    $ echo 's/''Text1''/Text2/g'
    s/Text1/Text2/g
    Das kommt bei sed als Skript an. Was sagt dir das?

    (Tip: welche anderen Quoting-/Escape-Mechanismen gibts noch auf shell-Ebene um das Problem zu umgehen?)

    Btw:
    Dürfte eigentlich nicht passieren. Er sollte immernoch Text1 finden und mit Text2 ersetzen. Nur halt die doppelten Single-Quotes nicht.
     
  4. nfidia

    nfidia Jungspund

    Dabei seit:
    06.03.2009
    Beiträge:
    19
    Zustimmungen:
    0
    Ich hab die beiden Befehle zu Hause ins Forum eingetippt, ohne sie noch mal ausprobiert zu haben, weil die Linuxumgebung (cygwin), unter der ich das machen will, sich auf dem Rechner auf der Arbeit befindet.

    Die Single-Quotes werden rausgefiltert/ignoriert. Also muss sed mitgeteilt werden: "beachte die Single-Quotes".

    Ich hab alle mir bekannten Escapemöglichkeiten ausprobiert, aber es klappt nicht. Entweder wird der Text nicht inkl. der Hochkommata ersetzt, oder sed meckert die Syntax an. Bin zu blöde/nicht erfahren genug ;-)

    Stimmt, das habe ich eben auch festgestellt. Der folgende Beispielbefehl

    sed 's/''Bla''/Bli/g' test.txt > test1.txt

    ersetzt hier unter Cygwin den String

    ''Bla'' (mit den einzelnen Hochkommata)

    durch

    Bli

    Lag wohl daran, dass die Textstrings, die in meinem echten sed-Befehl vorkommen, an sich schon nicht so richtig simpel sind.

    Ich weiß leider nicht weiter, wie würde ich denn die einzelnen Hochkommata gelöscht kriegen? Aus ''Bla'' möge Bli werden ...
     
  5. #4 Gott_in_schwarz, 09.03.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ja und nein. Die singlequotes werden nicht ignoriert, sondern sind (wie bereits gesagt) nur auf shell-Ebene vorhanden.

    Code:
    ''bla''foo"blub"''
    ist für (ba)sh derselbe String wie
    Code:
    blafooblub
    Das ist ein Leerstring ('') zusammengefügt mit bla zusammengefügt mit einem weiteren Leerstring ('') zusammengefügt mit blub zusammengefügt mit einem weiteren Leerstring.

    BTW, wenn bash in cygwin bei
    Code:
    echo ''foo''
    wirklich ''foo'' ausgibt, dann wäre die cygwin-bash völlig inkompatibel mit der "wirklichen" bash. Sicher, dass du es nicht einfach in cmd.exe ausprobiert hast?
    (btw ist cygwin hier etwas offtopic, aber das nur am Rande.)

    Wenn du single-Quotes innerhalb eines strings haben willst musst du diese Escapen. Zwei Möglichkeiten fallen mir jetzt grade ein:
    Code:
    string[0]=\'\'foo\'\'
    string[1]="''foo''"
    
    for i in "${string[@]}"; do echo "$i"; done
    Heißt dein Aufruf muss so aussehen:
    Code:
    sed "s/''foo''/bar/"
    # oder:
    sed s/\'\'foo\'\'/bar/
     
  6. nfidia

    nfidia Jungspund

    Dabei seit:
    06.03.2009
    Beiträge:
    19
    Zustimmungen:
    0
    .

    Aha. Das wusste ich nicht. Dankeschön ;-)

    Nee, keine Angst, die bash in meinem cygwin macht das so wie sie soll :))

    cmd.exe, was ist das? :D

    Vielleicht sollte ich hier besser mal virtualbox mal auf meinem Windows-Rechner auf der Arbeit installieren ...

    Beide Varianten funktionieren wunderbar! Dankeschön. Lass uns zusammen mal einen trinken gehen :)
     
  7. nfidia

    nfidia Jungspund

    Dabei seit:
    06.03.2009
    Beiträge:
    19
    Zustimmungen:
    0
    Moin Gott_in_schwarz,

    der Hinweis auf

    echo <Text>

    und wie die Ausgabe davon aussieht, ist wirklich nützlich. So kann ich feststellen, wie sed einen Text "sieht" - also ob da was maskiert, umklammert werden muss oder nicht.

    Dankeschön. Wieder was dazu gelernt ;-)
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema: sed: Text mit einzelnen Hochkommata ersetzen
Besucher kamen mit folgenden Suchen
  1. anführungszeichen sed

    ,
  2. sed suchen ersetzten anführungszeichen

    ,
  3. sed doppelte anführungszeichen maskieren

    ,
  4. hochkomma in sed,
  5. windows sed anführungszeichen ersetzen
Die Seite wird geladen...

sed: Text mit einzelnen Hochkommata ersetzen - Ähnliche Themen

  1. Kontextmenü mit einem Skript verbinden

    Kontextmenü mit einem Skript verbinden: Abend, wenn ich z. B. eine simple Umwandlung eines Bildformates in ein anderes über das KDE-Kontextmenü (Servicemenü nennt es sich im KDE oder...
  2. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  3. [code]Text[/code] im Editor nicht mehr vorhanden

    [code]Text[/code] im Editor nicht mehr vorhanden: Hallo, früher gab es im Editor noch den Button für das erstellen von Code-Segmenten. Ich hab das für Konsolen-Output oder angabe von Befehlen...
  4. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...
  5. Artikel: Shell Command Injection - Wie fremder Text in das Terminal gelangt

    Artikel: Shell Command Injection - Wie fremder Text in das Terminal gelangt: Man möchte sicher nicht, dass ein Fremder einen Befehl in das Terminal eingibt. Und doch kann es genau dazu kommen, wenn Skripte auf dem System...