Sostituzione dei punti (.) In sed


9

Quindi la vera domanda è: qualcuno ha un'idea su come rimuovere M-BM-un personaggio speciale senza rischiare di perdere altri personaggi?

Ho una stringa di testo:

" . . ."

questo è

space dot space dot space dot

Sto cercando di sostituire tutte le occorrenze di questa stringa nel file di testo a

"..."

questo è

dot dot dot

Stavo cercando di fare con sed:

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

Sfortunatamente, non cambia nemmeno un po 'il file di input. File: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Quando provo a sostituire la stessa stringa nell'editor di testo (uso geany) viene trovata e sostituita correttamente.

L'unica ragione a cui riesco a pensare è che alcuni (o tutti) di quegli spazi non sono realmente spazi, ma alcuni caratteri speciali.

Qualcuno ha idea di come trovare e sostituire quella stringa con sed (o qualsiasi altro strumento da riga di comando)? Per favore prova la tua idea sul mio file, poiché il problema non è così ovvio come potrebbe sembrare - ecco perché l'ho chiesto.

Dopo aver usato cat -Amyfile sembra che quegli spazi non siano spazi, ma M-BM-caratteri speciali. L'uso di qualsiasi simbolo .suggerito per la ricerca non è una buona idea in quanto esiste il rischio che alcuni altri caratteri vengano rimossi.

Risposte:


10

Prima di tutto vorrei iniziare testando echoe collegandolo sed, piuttosto che usare un file reale. In secondo luogo, è possibile utilizzare un {n}modello regex esteso per indicare multipli e limiti.

Eri praticamente lì ma il tuo regex si aspettava uno spazio di vantaggio.

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

Nota che \s?è ancora abbastanza avido da rovinare l'output, quindi ho aggiunto uno spazio all'output. Potresti non volerlo. Ho anche reso lo spazio opzionale, quindi corrisponderà a tutto quanto segue:

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

Basta rimuovere il ?flag opzionale .


Dato il tuo problema con Unicode (nei commenti) puoi forzare i dati alla sua equivalenza ASCII con iconve quindi sed:

$ 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

Sono sorpreso che tu consiglia di utilizzare echoinvece di catturare un file, almeno quando esegui il cat di un file, sai che la shell non sta interpretando nulla, e nemmeno l'eco.
Flimm,

@Flimm per un semplice esempio con punti, questo non è davvero un problema. Se hai intenzione di caricare da un file, non preoccuparti: devi catsolo sedcaricare il file (come nell'esempio dell'OP) ma non salvare in linea (rimuovi -i, in modo da poter vedere e testare l'output).
Oli

@Oli Funziona con il tuo esempio, ma non funziona con il mio file (nella mia domanda, c'è un link). Questo è un problema: il tuo comando e gli altri dovrebbero funzionare, ma non funzionano perché c'è qualche problema con quei punti. Per favore prova il tuo comando sul mio file e vedrai che non funziona.
Rafal

1
@Rafal Se guardi cat -A sed-dotspuoi vedere che gli "spazi" tra i punti sono M-BM- caratteri speciali ... Non sono sicuro di come si siano insinuati ma devono essere sostituiti. Se non riesci a bersagliarli bene, funziona: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@Oli Funziona. Grazie mille! Potresti spiegare la sintassi? Sei sicuro che non abbia effetti collaterali e non sostituirà nient'altro? Per quanto vedo, questo RegExp corrisponderà a qualsiasi carattere dopo i punti. Tuttavia, M-BM non è un personaggio, è tre. Quindi come può funzionare?
Rafal

0

Prova quanto segue per sostituire tutto "." A "."

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

Ma per ". . ." per "..."

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

0

Potrei usare il tuo file quando l'ho eseguito:

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

Questo ha funzionato senza un passaggio di conversione:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt

Non funziona. Immagino che il motivo sia strano personaggio M-BM che @Oli ha trovato.
Rafal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.