Procura e substitui as barras posteriores por barras

3

Ultimamente, tenho precisado excluir novos arquivos não acompanhados do meu sistema de controle de versão. Sendo no linux eu uso:

hg status -un|xargs rm

E funciona bem, mas ao fazer isso no Windows, hg status lista caminhos com barra invertida, e é aí que as coisas dão errado. Então eu tento:

hg status -un|sed 's/\/\//g'

... mas recebo o erro: sed: -e expressão # 1, char 8: comando 's' não terminado

Então eu tento alguns ascii:

'hg status -un|sed 's/\o134/\o57/g'' 

... isso me pega: sed: -e expressão # 1, char 14: Trailing backslash

E alguns scripts:

hg status -un|sed 's/'echo \'/'echo /'/g'

... isso me ajuda: sed: -e expressão # 1, char 19: opção desconhecida para 's'

Eu tento o último com qualquer outro personagem e recebo a saída esperada ... então estou completamente perdido. Eu tenho cygwin, é claro, e eu quero evitar o uso de um arquivo (é isso que eu tenho feito).

Obrigado antecipadamente

    
por dukeofgaming 11.02.2011 / 11:46

2 respostas

2

duke !, você está fazendo errado !, você pode usar : em vez de / para o regex:

hg status -un|sed 's:\:/:g'

* facepalm *

    
por 11.02.2011 / 12:01
0

Para evitar o erro "Trailing backslash", certifique-se de não remover a última barra invertida. Isso pode ser feito garantindo no regex que outro caractere 'não-invertido sempre segue o caractere a ser substituído. o sed deve ficar assim ...

sed "s:\([^\]\+\):/:g"

.., que traduz aproximadamente como:

encontre uma barra invertida, seguida por pelo menos 1 caractere que não seja uma barra invertida, e substitua por uma barra seguida pelos outros caracteres correspondentes.

Note que no meu regex (para bash) eu não precisei escapar das barras invertidas, mas eu precisava escapar das chaves redondas. O '\ 1' é uma referência de volta.

Espero que isso faça sentido!

    
por 25.02.2011 / 10:21