Eu executo vários comandos de substituição como o núcleo de um script colorize para maven . Um dos sed
comandos usa uma expressão regular que funciona e se encontra no shell, conforme discutido aqui . A implementação atual (não funcionando) pode ser encontrada aqui .
Quando incluo uma das variantes do comando no script, ocorre um comportamento diferente:
Variante 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Adaptado ao roteiro:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Erro: o shell exibe as mesmas informações que se eu digitaria $ sed
. Estranho!?
Variante 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Adaptado ao roteiro:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Erro:
sed: -e expressão # 7, char 59: referência inválida \ 1 no RHS do comando `s '
regex
sed
substitution
JJD
fonte
fonte
-i
(opção editar no local) com-re
, resultando em-ire
(de modo que-i
estava consumindo ore
fragmento como seuSUFFIX
argumento e, portanto, o modo regex estendido não estava sendo ativado); alterá-lo para-i -re
corrigir o problema.'
e duplas"
são tratadas de maneira ligeiramente diferente, especialmente na interpretação$vars
. Por exemplo:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
funciona, mas:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
não.Respostas:
Você não precisa realmente capturar para que funcione? ou seja, para a variante 2:
(Nota: não testado)
Sem o argumento -r, as referências anteriores (como \ 1) não funcionarão.
fonte
-r
opção sed parece ser necessária para que a referência anterior funcione. Por exemplo,sed -e 's/([[:digit:]])/is a digit/'
funciona, massed -e 's/([[:digit:]])/\1 is a digit/
produz o erro original sem-r
sed. NOTA: a primeira chamada de sed procura um literal(<digit>)
e não é um grupo de captura.-ire
vez de usar-ri
. O pedido é importante :-)Este erro é comum para parênteses sem escape. Fuja deles e tente novamente.
Por exemplo:
Deve ser escapado com barras invertidas antes de cada parêntese:
fonte
-r
não precisa escapar dos parênteses.Se a opção
-r
/--regexp-extended
não for fornecida, os parênteses de captura devem ser escapados.fonte
Você precisa escapar do
/
depois do.
Ou se você não quiser se preocupar em escapar, use
|
EDITAR:
fonte
sed: -e expression #7, char 58: Invalid range end
. A resposta de @Denis funciona.