Caractere igual especial com sed da shell

2

Meu ambiente:

Estou trabalhando com o interpretador de comandos no Windows.

Eu uso um sh.exe que veio com algumas ferramentas proprietárias que instalei. Eu não sei os detalhes desse sh.exe mas aqui está o que eu recebo ao consultar sua versão:

>sh.exe --version
GNU bash, version 3.1.23(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

Da mesma forma, aqui está o que eu tenho para o sed:

>sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <[email protected]>.
Be sure to include the word ''sed'' somewhere in the ''Subject:'' field.

O que eu estou procurando:

Eu gostaria de poder usar um comando sed que corresponda ao caractere igual e faça isso a partir de um script de shell.

Isso funciona como esperado:

>echo "a=b" | sed "s/a=//"
"b"

Se parse_trace.sh contiver

#!/bin/sh

sed "s/a//"

Eu também consigo o que espero:

>echo "a=b" | sh parse_trace.sh
"=b"

No entanto, substituindo a última linha do meu script por:

sed "s/a=//"

leva a

>echo "a=b" | sh parse_trace.sh
sed.exe: -e expression #1, char 5: unterminated 's' command

E se eu usar em vez disso

sed "s/a\=//"

Eu obtenho

>echo "a=b" | sh parse_trace.sh
"==b"

O que estou perdendo?

Atualizar

O sinal = é interpretado corretamente no meu script de shell, se não for o último caractere no padrão. Ou seja se minha última linha no script for agora:

sed "s/a=b//"

Então eu recebo:

echo "a=b" | sh parse_trace.sh
""

echo "a=bc" | sh parse_trace.sh
"c"

Portanto, há algo sobre o = / que faz o combo DOS-SHELL falhar de alguma forma.

Atualização 2

>od -Ax -tx1z parse_trace.sh
000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 73 65 64 20 22  >#!/bin/sh..sed "<
000010 73 2f 61 5c 3d 2f 2f 22 0a 0a                    >s/a\=//"..<
00001a

>echo "a=b" | sh -x parse_trace.sh
+ sed 's/a\=//'
"==b"

>od -Ax -tx1z parse_trace.sh
000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 73 65 64 20 22  >#!/bin/sh..sed "<
000010 73 2f 61 3d 2f 2f 22 0a 0a                       >s/a=//"..<
000019

>echo "a=b" | sh -x parse_trace.sh
+ sed s/a=//
sed.exe: -e expression #1, char 5: unterminated 's' command
    
por Lolo 23.11.2015 / 15:46

1 resposta

0

Não sei se funcionará, mas acho que é uma boa ideia:

sed 's,a\x3d,,'

Eu tentei no meu ambiente, funciona. Há duas coisas que podem ser a razão pela qual você teve essa situação:
uma. O sh que você está usando eo cmd juntos tratam '/' e '\' ambos delimitadores de sed.
b. Você está usando aspas duplas, que bash tentará encontrar a equação e vars dentro dela.

Eu mesmo uso cmd combinado com comandos shell muito, eu recomendo que você tente cygwin. Adicionar o caminho bin do cygin ao PATH das janelas, funcionará como um encanto. Mas você precisa ter cuidado com o ESCAPE.

    
por 29.01.2016 / 16:15

Tags