Estou tendo um problema com sed , ao usar seu ' s ' (comando de busca e substituição) com seu sinalizador ' e ', como em
sed 's/.../.../e'
O problema é que os caracteres $
, (
, e )
na entrada padrão parecem confundir.
Eu o encontrei pela primeira vez aqui e agora resumi a isso:
echo '$-' | sed 's/x//e' # works when pattern is NOT matched
$-
echo '$-' | sed 's/-//e' # fails when pattern is matched: gags on $
sh: $: command not found
echo '-' | sed 's/-//e' # works when $ isn't present
echo '-(' | sed 's/-//e' # Also fails when '(' or ')' are found
sh: -c: line 1: syntax error: unexpected end of file
echo '(' | sed 's/-//e' # But works with this
(
echo '$-' | sed 's/-/echo xx/e' # also fails
sh: xx: command not found
echo '$-' | sed 's/\(-\)/echo '\1'/e' # also fails
sh: 1: command not found
Aqui está o que o manual GNU diz:
3.3 O Comando s
...
O comando s pode ser seguido por zero ou mais dos seguintes sinalizadores:
...
e
Este comando permite canalizar a entrada de um comando shell para o espaço padrão. Se uma substituição foi feita, o comando encontrado no espaço padrão é executado e o espaço padrão é substituído por sua saída. Uma nova linha à direita é suprimida; os resultados são indefinidos se o comando a ser executado contiver um caractere NUL. Esta é uma extensão GNU sed.
bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
sed --version
sed (GNU sed) 4.7
Packaged by Debian
O que estou perdendo ou fazendo errado?
Corrida
remove o
-
from$-
, deixando apenas$
, e o resultado é executado como um comando shell, por causa do/e
.O resultado é o mesmo se você tentar executar
$
a partir da linha de comando:E da mesma forma para todas as outras linhas.