por que é verdade que três barras invertidas são necessárias no windows para sed substituir

2

Referindo-se a esta pergunta:

Por que é necessário um \ extra em cmd.exe para trabalhar com sed (MinGW msys-1.0) quando \ não é um caractere especial de acordo com cmd /? (consulte o último parágrafo ou aqui )?

The following special characters require quotation marks: & < > [ ] { } ^ = ; ! ' + , ' ~ [white space]

Primeira barra invertida escapa a segunda, roubando-lhe o seu significado especial. Duas barras invertidas restantes são dadas para sed , que escapa do terceiro usando o segundo, então uma única barra invertida única é deixada no final, que é correspondida por minha pesquisa e substituição. Mas ainda estou insatisfeito com esta explicação, porque:

O cmd não executa tokenizing, portanto, a primeira etapa de escape não faz sentido ... de aqui , \ tem apenas algum significado especial ao preceder " ... então, qual é a explicação real?

no bash no linux:

echo 'sample\input' | sed 's/\/----/'
sample----input

em cmd.exe no windows xp sp3 (sem ' necessário):

echo sample\input | sed "s/\/----/"
sed: -e expression #1, char 9: unterminated 's' command 
// for some reason sed received only one backslash which causes him trouble ?

echo sample\input | sed "s/\\/----/"
sample----input
    
por panny 13.02.2013 / 18:18

1 resposta

3

Sed está fazendo isso, ele usa um regex na seção "find". usa BRE ou ERE ou PCRE dependendo do interruptor. Backslash é especial dentro de um regex.

Adicionado

Eu não usei sua versão de usar aspas simples, porque isso não faz sentido para mim em cmd.exe !! O cmd.exe usa aspas duplas, se houver.

E isso funciona bem.

testado com o sed do gnuwin32 a partir do cmd.exe como deveria ser.

C:\>echo sample\input | sed "s/\/----/"
sample----input

C:\>sed --v
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.

Se eu estivesse testando o cygwin's sed, eu o executaria a partir da janela do cygwin, pois é onde os programas do cygwin devem ser executados. E então eu usaria aspas simples. msys parece semelhante ao cygwin nesse sentido.

UPDATE

Você pode executar o sed do cygwin a partir do cmd ou do cygwin. Eles se comportam de maneira diferente porque são versões GNU diferentes, mas eu não vejo nenhum problema relacionado ao shell rodando a partir do cmd vs cygwin (além do simples ponto sobre aspas simples para cygwin 'cos eg bash e aspas duplas para cmd).

E o cygwin é uma versão muito posterior do sed. O sed do Gnuwin32, como muitas outras coisas do gnuwin32, incluindo o gnuwin32 grep, está anos fora de moda. e por exemplo os greps posteriores podem corrigir bugs em greps anteriores. O sed 2009 que o gnuwin32 usa, ou a versão menos atualizada que o gnuwin32 usa, pode estar ok, mas pode ser melhor usar uma versão recente que o cygwin usaria.

Curiosamente, os seds se comportam de maneira diferente em relação à barra invertida. Eu posso ver como fazê-lo funcionar no sed mais tardio, o sed que o cygwin usa.

C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\/_/"
/usr/bin/sed: -e expression #1, char 6: unterminated 's' command

C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\\/_/"
a_bc

C:\blah>echo a\bc | "c:\Program Files (x86)\GnuWin32\bin\sed" "s/\/_/"
a_bc

O sed anterior (sed do gnuwin32), permite "s / \ / _ /" Não está escapando da barra. Portanto, a barra invertida está escapando da barra invertida para criar uma barra invertida literal. E a barra depois das duas barras invertidas continua boa. E isso funciona.

note: executar o sed do cygwin no cmd é bom. E como é uma versão posterior, é preferível o sed do gnuwin32.

O último sed (cygwin's sed), não permite "s / \ / _ /" porque o / está escapando da barra. Instinto (e instinto correto) seria tentar adicionar outra barra invertida e ver o que acontece. E isso funciona. Não tenho certeza da mecânica, mas acho que uma única barra invertida no último sed é \\ .

C:\blah>echo \ | c:\cygwin\bin\sed "s/\\/d/"
d
    
por 07.03.2013 / 00:04