sed: Text mit einzelnen Hochkommata ersetzen

N

nfidia

Jungspund
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 ?(
 
Zuletzt bearbeitet:
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:
Wenn ich schreibe

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

dann findet sed nichts in <Datei1>
Dürfte eigentlich nicht passieren. Er sollte immernoch Text1 finden und mit Text2 ersetzen. Nur halt die doppelten Single-Quotes nicht.
 
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.)

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.

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

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

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

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 ;-)

Btw:

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

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 ...
 
Die Single-Quotes werden rausgefiltert/ignoriert. Also muss sed mitgeteilt werden: "beachte die Single-Quotes".
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/
 
.

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.

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

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.

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

Sicher, dass du es nicht einfach in cmd.exe ausprobiert hast?

cmd.exe, was ist das? :D

(btw ist cygwin hier etwas offtopic, aber das nur am Rande.)

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

Heißt dein Aufruf muss so aussehen:
Code:
sed "s/''foo''/bar/"
# oder:
sed s/\'\'foo\'\'/bar/

Beide Varianten funktionieren wunderbar! Dankeschön. Lass uns zusammen mal einen trinken gehen :)
 
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 ;-)
 

Ähnliche Themen

sed / Variable in mehreren Dateien ersetzen

probleme mit select()

Zurück
Oben