Substituição de pontos (.) em sed

8

Portanto, a pergunta atual é: alguém tem uma ideia de como remover M-BM- caractere especial sem arriscar perder outros caracteres?

Eu tenho uma string de texto:

" . . ."

isto é

space dot space dot space dot

Estou tentando substituir toda a ocorrência dessa string no arquivo de texto

"..."

isto é

dot dot dot

Eu estava tentando fazer com sed:

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

Infelizmente, isso não altera o arquivo de entrada nem um pouco. Arquivo: link

Quando tento substituir a mesma string no editor de texto (eu uso o geany) ele é encontrado e substituído corretamente.

A única razão que posso pensar é que alguns (ou todos) desses espaços não são realmente espaços, mas algum caractere especial.

Alguém tem idéia de como encontrar e substituir essa cadeia com sed (ou qualquer outra ferramenta de linha de comando)? Por favor, teste sua ideia no meu arquivo, já que o problema não é tão óbvio quanto parece - por isso perguntei sobre isso.

Depois de usar cat -A myfile, parece um problema que esses espaços não sejam espaços, mas M-BM- caractere especial. Usar qualquer símbolo . sugerido para pesquisa não é uma boa ideia, pois há o risco de alguns outros caracteres serem removidos.

    
por Rafal 12.03.2013 / 15:14

3 respostas

7

Primeiro eu começaria testando com echo e canalizando isso para sed , do que usando um arquivo real. Em segundo lugar, você pode usar um {n} no modelo regex estendido para denotar múltiplos e limites.

Você estava muito bem lá, mas seu regex esperava um espaço de liderança.

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

Observe que o \s? ainda é ganancioso o suficiente para estragar a saída, então adicionei um espaço à saída. Você pode não querer isso. Eu também tornei o espaço opcional, então ele corresponderá a todos os itens a seguir:

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

Basta remover o sinalizador ? opcional.

Dado seu problema com unicode (nos comentários), você pode forçar os dados para sua equivalência ASCII com iconv e, em seguida, sed-lo:

$ 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
    
por Oli 12.03.2013 / 15:24
0

Tente o seguinte para substituir todos os "." por "."

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

Mas para "..." para "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
    
por Meer Borg 12.03.2013 / 15:24
0

Eu poderia usar seu arquivo quando o fizesse:

tr '0' ' ' < sed-dots.txt > sed-dots.new

Isso funcionou sem uma etapa de conversão:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt
    
por Scrutinizer 12.03.2013 / 17:13