Punkte (.) In sed ersetzen

9

Die eigentliche Frage ist also: Hat jemand eine Idee, wie man M-BM-Sonderzeichen entfernt, ohne das Risiko einzugehen, andere Zeichen zu verlieren?

Ich habe eine Textfolge:

" . . ."

das ist

space dot space dot space dot

Ich versuche, alle Vorkommen dieser Zeichenfolge in der Textdatei zu ersetzen

"..."

das ist

dot dot dot

Ich habe versucht mit sed zu tun:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

Leider ändert es die Eingabedatei nicht einmal ein bisschen. Datei: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Wenn ich versuche, dieselbe Zeichenfolge im Texteditor zu ersetzen (ich verwende geany), wird sie gefunden und ordnungsgemäß ersetzt.

Der einzige Grund, an den ich denken kann, ist, dass einige (oder alle) dieser Räume nicht wirklich Räume sind, sondern ein besonderer Charakter.

Hat jemand eine Idee, wie man diese Zeichenfolge findet und durch sed (oder ein anderes Befehlszeilenprogramm) ersetzt? Bitte testen Sie Ihre Idee in meiner Datei, da das Problem nicht so offensichtlich ist, wie es scheint - deshalb habe ich danach gefragt.

Nach der Verwendung von cat -Amyfile scheint es ein Problem zu sein, dass diese Leerzeichen keine Leerzeichen, sondern M-BM-Sonderzeichen sind. Die Verwendung eines .für die Suche vorgeschlagenen Symbols ist keine gute Idee, da das Risiko besteht, dass einige andere Zeichen entfernt werden.

Rafal
quelle

Antworten:

9

Zuerst würde ich damit testen echound das weiterleiten sed, als eine echte Datei zu verwenden. Zweitens können Sie {n}im erweiterten Regex-Modell ein verwenden, um Vielfache und Grenzwerte zu kennzeichnen.

Sie waren so ziemlich dort, aber Ihre Regex erwartete einen führenden Platz.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

Beachten Sie, dass das \s?immer noch gierig genug ist, um die Ausgabe zu ruinieren, daher habe ich der Ausgabe ein Leerzeichen hinzugefügt. Das willst du vielleicht nicht. Ich habe den Platz auch optional gemacht, damit er mit allen folgenden Punkten übereinstimmt:

...
. ..
.. .
. . .
 . . . 

Entfernen Sie einfach die optionale ?Flagge.


Angesichts Ihres Problems mit Unicode (in den Kommentaren) können Sie die Daten auf ihre ASCII-Äquivalenz mit erzwingen iconvund sie dann sedieren:

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text
Oli
quelle
Ich bin überrascht, dass Sie empfehlen, echoeine Datei zu verwenden, anstatt sie zu kattieren. Zumindest wenn Sie eine Datei katzen, wissen Sie, dass die Shell nichts interpretiert und Echo auch nicht.
Flimm
@Flimm für ein einfaches Beispiel mit Punkten, das ist nicht wirklich ein Problem. Wenn Sie aus einer Datei laden möchten, kümmern Sie sich nicht darum cat- sedladen Sie einfach die Datei (gemäß dem Beispiel des OP), speichern -iSie sie jedoch nicht inline (entfernen Sie sie , damit Sie die Ausgabe sehen und testen können).
Oli
@Oli Es funktioniert mit Ihrem Beispiel, aber es funktioniert nicht mit meiner Datei (in meiner Frage gibt es einen Link). Das ist ein Problem - Ihr Befehl und andere sollten funktionieren, aber sie tun es nicht, da es ein Problem mit diesen Punkten gibt. Bitte testen Sie Ihren Befehl in meiner Datei und Sie werden sehen, dass es nicht funktioniert.
Rafal
1
@ Rafal Wenn Sie sich das ansehen cat -A sed-dots, können Sie sehen, dass die "Leerzeichen" zwischen den Punkten Sonderzeichen sind M-BM- ... Ich bin mir nicht sicher, wie sie sich dort eingeschlichen haben, aber sie müssen ersetzt werden. Wenn Sie sie nicht gut anvisieren können, funktioniert dies: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli
@Oli Es funktioniert. Vielen Dank! Könnten Sie die Syntax erklären? Sind Sie sicher, dass es keine Nebenwirkungen hat und nichts anderes ersetzen wird? Soweit ich sehe, stimmt dieses RegExp mit jedem Zeichen nach Punkten überein. M-BM ist jedoch nicht ein Charakter, sondern drei. Wie kann es also funktionieren?
Rafal
0

Versuchen Sie Folgendes, um alle "." Durch "." Zu ersetzen.

sed -r 's/\. /\./g' -i sed-dots

Aber für ". . ." zu "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
Meer Borg
quelle
0

Ich könnte Ihre Datei verwenden, wenn ich sie durchlaufen habe:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

Dies funktionierte ohne einen Konvertierungsschritt:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt
Scrutinizer
quelle
Es funktioniert nicht. Ich denke, dieser Grund ist ein seltsamer M-BM-Charakter, den @Oli gefunden hat.
Rafal