Applescript + sed: Anführungsstriche ersetzen

werk

Mitglied
Thread Starter
Dabei seit
18.05.2015
Beiträge
96
Reaktionspunkte
3
Hallo.

Ich habe einen Rohtext, der Anführungsstriche mit einem Backslash enthält, wie z.B. \"Zar\". Innerhalb eines Applescripts bearbeite ich den Text mit einer langen Reihe von sed-Ersetzungsbefehlen:
Code:
do shell script "sed -i '' -E 's/pattern/replacement/g; s/pattern/replacement/g' filename.txt"
(Das nach dem -i sind zwei Single-Quotes, ist kein Double Quote.)

Da auch an anderer Stelle im Text Backslashes (ohne double quote) vorkommen können, kann ich nicht einfach alle Backslashes entfernen, sondern muss gezielt \" durch " ersetzen.
Nur macht das leider im Applescript Probleme. Als Test habe ich folgendes Applescript:
Code:
set mytext to "das Wort \"Zar\""

do shell script "echo " & quoted form of mytext & " | sed -E 's/\"/"/g'"

Mir fällt gerade nicht ein, wie ich in Applescript ein double quote " als replacement einfügen kann, so dass es keinen Fehler gibt. Vielen Dank für die Hilfe.
 
das geht imho mit AS+sed nicht, weil ausgerechnet " nicht im replace stehen kann.
evtl. hilft dir single-' weiter:
Code:
do shell script "echo " & quoted form of mytext & " | sed -E 's/\\\"/'\\''/g'"
oder »text«:
Code:
do shell script "echo " & quoted form of mytext & " | sed -E 's/\\\"(.*)\\\"/»\\1«/g'"
 
Hatte ich fast befürchtet. Dann muss ich halt entweder nen anderen Befehl nachschalten (grep o.ä.) oder jeweils manuell :sick: ran.
Danke.
 
Vielleicht unorthodox, aber kannst du nicht das " durch ein Zeichen ersetzen das im Text nicht vorkommt, dann alle Vorkommnisse von \Zeichen ersetzen und am Ende Zeichen zurück mit " ersetzen?
 
es geht doch um " im replace-string. und das geht eben nicht aus AS heraus, noch dazu wegen "quoted form of". siehe beispiel 2 (»text«) in #2.
was immer geht, ein bash-script, was die ersetzung macht, nachschalten oder gleich die komplette logik in bash erledigen und AS nur noch als starter verwenden (so mache ich das i.d.R.).

wenn ich zeit finde, probiere ich mal awk. evtl. geht's damit.
 
Danke. Habe zu flüchtig gelesen. Funktioniert evtl. der entsprechende ASCII-Code \x27 ?
 
probiers aus. bin grad anderweitig unterwegs. und wenn dann \x22. :p
 
Auch gerade nicht wirklich am Rechner.
 
Hallo,

Die beiden Zeichen Backslash und Anführungszeichen sind ausgerechnet die beiden Zeichen in AppleScript, die eine besondere Bedeutung als Zeichenkettenzeichen (oje...gibt es das Wort?) haben!

Special String Characters
The backslash (\) and double-quote (") characters have special meaning in text. AppleScript encloses text in double-quote characters and uses the backslash character to represent return (\r), tab (\t), and linefeed (\n) characters (described below). So if you want to include an actual backslash or double-quote character in a text object, you must use the equivalent two-character sequence. As a convenience, AppleScript also provides the text constant quote, which has the value \"

Quelle: Apple

- - - - - - - - - - - -


Sonderzeichen müssen (oder sollten zumindest) mit einem Maskierungszeichen maskiert werden... üblicherweise mit einem Backslash. Ein Backslash als Sonderzeichen wird dem entsprechend mit einem Backslash maskiert.
In AppleScript müssen die Maskierungszeichen wiederum selber maskiert werden :D

Das nötige Skript sähe so aus:
Code:
sed -i '' -E  's/\\\"/\"/g' filename.txt

In AppleScript wird daraus:
Code:
do shell script "sed -i '' -E  's/\\\\\"/\"/g' filename.txt
Es ersetzt alle \" in einem Textfile durch "




- - - - - - - -

Da Anführungszeichen immer einen Text einschließen und innerhalb eines Textes maskiert werden (siehe Zitat), wird ein in AppleScript ausgeführtes
Code:
set mytext to "das Wort \"Zar\""
do shell script "echo " & quoted form of mytext
zwar folgendes Ergebnis bringen
Code:
"das Wort \"Zar\""
Hier wird aber das "eigentliche" Ergebnis sichtbar:
Code:
set mytext to "das Wort \"Zar\""
set x to do shell script "echo " & quoted form of mytext
display dialog x

Sprich:
Um wirklich die Zeichenfolge \"Zar\" in AppleScript zu schreiben, müsste es so aussehen:
Code:
set mytext to "das Wort \\\"Zar\\\""
set x to do shell script "echo " & quoted form of mytext
display dialog x

Und ein Test-Skript müsste dann so aussehen:
Code:
set mytext to "das Wort \\\"Zar\\\""
set theReplacedText to do shell script "echo " & quoted form of mytext & " | sed  's/\\\\\"/\"/g'"
display dialog "Vorher:" & tab & mytext & return & "Jetzt:" & tab & theReplacedText
editiert

Gruß
 
Zuletzt bearbeitet:
evtl. habe ich das problem nicht verstanden. aber 1. sehe ich mytext als gegeben und 2. das problem befindet sich doch gerade innerhalb von AS, weil "Ergebnis/Antworten" und display dialog mytext divergieren und deshalb komme ich ja mit do-shell-script-tools nicht weiter.
 
Hallo,

ich kann halt nicht so gut erklären :p

Du hast definitiv (!) viel mehr Ahnung von Unix Skripten als ich.... es ist halt nur so, dass AS eine eigene Schreibweise verlangt:

Ich wiederhole: da in AS Text immer in Anführungszeichen gesetzt wird und Anführungszeichen innerhalb eines Textes maskiert werden, ist "das Wort \"Zar\"" die AS Schreibweise von das Wort "Zar"
Hier wird aber eigentlich \"Zar\" gesucht, welches in AS "\\\"Zar\\\"" geschrieben wird, da auch der Backslash als Sonderzeichen maskiert werden muss.
Da divergiert nix.
Ist eine reine Anwendungssache (und man muss sozusagen das Ergebnis "richtig" lesen)

Ein Test-Skript, welches innerhalb von AS läuft, muss man deshalb gegebenenfalls anpassen:
Das von dir gepostete Skript ersetzt also gar nicht \" durch ' sondern nur " durch '

zu 2) ja nee, geht doch. Siehe das do shell script in meinen vorherigen Post...


Gruß
 
Zurück
Oben Unten