Wie ersetze ich Anführungszeichen in einer Datei durch sed?

10

Ich habe eine Datei, die mehrere Zeilen XML enthält. Ich möchte bestimmte Teile der Datei ersetzen. Einige Teile der Datei enthalten Anführungszeichen ( "), die ich ersetzen möchte. Ich habe versucht , zu entkommen das Anführungszeichen mit \, aber ich glaube nicht , das ist die Arbeit am Ergebnis meiner Datei basiert.

Hier ist ein Beispiel für einen meiner sed-Befehle:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

Entkommen Sie auf diese Weise Anführungszeichen in einem sed-Befehl oder mache ich etwas falsch?

jbranchaud
quelle
2
Ihr Befehl sieht zum Ersetzen "text"durch richtig aus 'text'. Natürlich wird es nichts tun "othertext". Zeigen Sie einige Eingabezeilen und die entsprechende unerwünschte Ausgabe an und erklären Sie stattdessen, welche Ausgabe Sie möchten.
Gilles 'SO - hör auf böse zu sein'
Ist \"der richtige Weg, Anführungszeichen im Befehl sed zu umgehen?
Jbranchaud
4
Nicht für sed: sed braucht oder unterstützt keine Flucht ". Ihr Shell-Befehl verwendet jedoch eine Zeichenfolge in doppelten Anführungszeichen und \"ist dort korrekt. Das sedProgramm sieht s/"text"/'text'/igals Argument dafür -e.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Was ist mit Räumen? Versteht und respektiert sed Leerzeichen? Zum Beispiel, wenn mein Befehl enthalten s/\"text\" /'text'/igwürde Würde er nur "text" mit dem Leerzeichen danach finden?
Jbranchaud
3
Leerzeichen müssen genau übereinstimmen. Anstatt diesen Dialog fortzusetzen, empfehle ich Ihnen, einige Beispieleingaben und die entsprechende gewünschte Ausgabe zu veröffentlichen (und möglicherweise zu erklären, warum Sie das Angebot ändern müssen). Es ist nicht einmal klar, dass dies seddas richtige Werkzeug für den Job ist. Vielleicht möchten Sie einen XML-Parser.
Gilles 'SO - hör auf böse zu sein'

Antworten:

11

Zwei Tipps:

  1. Sie können einem einfachen Anführungszeichen innerhalb einer Zeichenfolge mit einfachen Anführungszeichen nicht entkommen. Sie müssen also das Zitat schließen, ein maskiertes Zitat hinzufügen und die Anführungszeichen erneut öffnen. Das heißt : 'foo'\''bar', was sich aufteilt als:

    • 'foo'        zitiert foo
    • \'             entkam '
    • 'bar'        zitiert bar

    Nachgeben foo'bar.

  2. (optional) Sie müssen nicht unbedingt /in sed verwenden. Ich finde, dass die Verwendung /und \im gleichen sed-Ausdruck das Lesen erschwert.

So entfernen Sie beispielsweise die Anführungszeichen aus dieser Datei:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

In Anbetracht meiner beiden obigen Tipps lautet der Befehl, mit dem Sie sowohl doppelte als auch einfache Anführungszeichen entfernen können:

$ sed -e 's|["'\'']||g'  /tmp/f

Basierend auf meinem ersten Tipp reduziert die Shell das zweite Argument von sed (dh die Zeichenfolge nach dem -e) auf s|["']||gund übergibt diese Zeichenfolge an sed. Basierend auf meinem zweiten Tipp behandelt sed dies genauso wie s/['"]//g. Es bedeutet

Entfernen Sie alle Zeichen, die entweder mit 'oder übereinstimmen "   (dh ersetzen Sie sie durch nichts).

Sie brauchen wahrscheinlich etwas Komplexeres, um das zu tun, was Sie wollen, aber es ist ein Anfang.

Yves Junqueira
quelle
1
Um Ihren zweiten Tipp genauer zu definieren: Sie können jedes Zeichen anstelle von / verwenden, wenn Sie die Befehle s und y verwenden, möglicherweise unter anderem. Wenn Sie reguläre Ausdrücke mit anderen sed-Befehlen verwenden, muss das erste Trennzeichen (wenn Sie eine Alternative zu / verwenden) maskiert werden. Ihr bevorzugtes Trennzeichen muss auch maskiert werden, wenn Sie versuchen, es innerhalb des regulären Ausdrucks abzugleichen.
Eli Heady
Es ist schwierig, einfache und doppelte Anführungszeichen zu mischen, ohne chaotisch zu werden. Einige Leute finden es einfacher zu lesen, wenn Sie einfache Anführungszeichen zitieren , indem Sie sie in doppelte Anführungszeichen setzen, anstatt ihnen zu entkommen. Also, anstatt 'foo'\''bar', könnten wir verwenden 'foo'"'"'bar'.
Scott
0

Ich habe einen Windows-Port mit Unix-Dienstprogrammen, sodass Befehle etwas anders aussehen, aber ich hatte eine CSV-Datei mit Kommas und Anführungszeichen. Mit diesem Thread als Leitfaden konnte ich die Anführungszeichen über diesen Befehl entfernen:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"
JaimeR744
quelle