Perl linha de comando RegEx não correspondente

0

Então eu tenho um arquivo com o conteúdo no seguinte formato,

randomString abc\/def/ghi/mno\/pq/r   abc\/def\/ghi/mno\/pq/r

Minha intenção é substituir todas as ocorrências de / por \/ entre duas cadeias alfanuméricas se a palavra final não tiver \ ou / , então, idealmente, deve ser

randomString abc\/def\/ghi\/mno\/pq/r   abc\/def\/ghi\/mno\/pq/r

Consegui quase alcançar o resultado usando este regEx

perl -pe 's/(\/\w+)\/(\w+\/|\w+\)/$1\\/$2/g' file

que está me devolvendo

randomString abc\/def\/ghi/mno\/pq/r   abc\/def\/ghi\/mno\/pq/r

por algum motivo, não consigo entender por que ghi/mno parte da string não está sendo modificada.

Estou procurando uma maneira de fazer isso na linha de comando perl .

    
por Inian 14.12.2016 / 17:33

1 resposta

2

Você pode usar lookarounds para substituir somente as barras que são:

  • (?<!\) não precedido por uma barra invertida
  • (?!\w+\s) não seguido por caracteres do Word terminados em espaço em branco

por exemplo,

echo 'randomString abc\/def/ghi/mno\/pq/r   abc\/def\/ghi/mno\/pq/r' |
  perl -pe 's;(?<!\)/(?!\w+\s);\/;g'
randomString abc\/def\/ghi\/mno\/pq/r   abc\/def\/ghi\/mno\/pq/r
    
por 14.12.2016 / 17:59