início da linha correspondente em cygwin regexp

2

Eu aplico sed 's/^ bug*/__/' a

  ref      bug
  bug      ref

e obtenha

  ref     __
 __      ref

O mesmo é respondido por perl, perl -ni -e 's/^ bug/__/; print' . O arquivo de amostra pode ser baixado aqui . Sed e perl são utilitários cygwin que eu executo a partir da linha de comando do Windows. Quando eu os executo através do cygwin bash, isso não acontece.

    
por Val 12.02.2013 / 15:38

3 respostas

4

O problema tem a ver com "quirks" cmd.exe (por falta de uma palavra melhor) com o tratamento de caracteres não-alfanuméricos entre aspas simples neste caso. Essencialmente, os caracteres de cursor e espaço estão sendo ignorados.

A maneira mais fácil de evitar o problema (se executá-lo em um shell bash apropriado do Cygwin não é uma opção desejável) seria usar aspas duplas ...

C:\cygwin\home\costa\wk>sed 's/^  bug*/__/' sed.txt
  ref    __
__      ref

C:\cygwin\home\costa\wk>sed "s/^  bug*/__/" sed.txt
  ref      bug
__      ref
    
por 12.02.2013 / 19:41
0

Antes de mais nada, use isso:

sed 's/^ *bug-+/__/' input

Dessa forma, ele funcionará para vários espaços antes de bug e um ou mais traços após ele. Isso é apenas um detalhe menor embora. O comando que você postou funciona bem no meu Debian.

Você poderia postar o arquivo real que está tentando modificar em algum lugar? Eu estou supondo que você tem janelas ou terminações de linha de estilo Mac e que podem confundir sed. Se estou certo, isso deve ajudar:

perl -pi -e 's/\r\n|\n|\r/\n/g' input

Em seguida, execute o mesmo comando sed no arquivo novamente.

Se isso não funcionar, pode haver algo específico sobre sed do cygwin. Tente este comando Perl (depois de ter certeza que o caractere de fim de linha é \n pelo comando acima):

perl -ne 's/^\s*bug-+/__/; print'
    
por 12.02.2013 / 15:58
0

(Este é um comentário, mas eu não tenho reputação suficiente para adicionar um comentário ainda ...)

Você acabou de fritar meu cérebro. No meu Cygwin, acontece a mesma coisa. Fiquei chocado. Parece ser um bug em como os curingas são manipulados, se eles estão usando a sintaxe de expressão regular ou estilo glob (estilo glob é onde * significa 'qualquer número de qualquer tipo de caractere', expressão regular * significa '0 ou mais dos personagens anteriores '.

Então eu tentei no meu shell QNX. Ele funciona IFF Eu não tento usar um plus antes de bug, como em "s / ^ + bug - / __ /". Eu posso substituir um * no lugar do + e ele funciona. Eu acho que algumas implementações de sed estão tendo dificuldade em escolher a sintaxe regex ou glob eo resultado é uma bagunça imprevisível.

Eu não experimentei o Perl (ainda não o instalei nesta nova máquina), mas ficaria duplamente chocado se Perl lidasse com ele de maneira tão ruim.

Para responder à sua pergunta, de acordo com o meu conhecimento e cerca de 100.000 dos meus amigos mais próximos no Google, sua compreensão de como o deve funcionar é precisa.

    
por 12.02.2013 / 17:38