Aqui está o que estou tentando replicar:
$ cat << EOF | { var=$(grep 'foo=');\
if (( $? == 0 )); then echo "$var"\
| sed -E 's/foo=(.+)/\1/'; else exit 1; fi; }
foo
foo=bar
EOF
bar
Usando sed
exclusivamente:
$ cat << EOF | sed -nE '/foo=/p s/foo=(.+)/\1/'
foo
foo=bar
EOF
sed: -e expressão #1, char 9: caracteres extras após o comando
Qual é a causa do erro e como corrigi-lo?
Você está tentando fazer
Seu comando tinha um
p
após o endereço inicial (a expressão regularfoo=
), que o transformou em umsed
comando de edição completo (com os/...
lixo à direita quesed
reclamou) em vez de um endereço para os
comando.No comando acima,
/foo=/
é um endereço para os
comando subsequente. Os
comando seria aplicado a cada linha correspondente à expressão regularfoo=
. A-n
opçãosed
faz com que evite imprimir o buffer de edição após cada ciclo, por isso usamos op
sinalizador com os
comando para imprimir a linha modificada.No entanto, você também pode escrever isso como
que exclui o
foo=
bit em cada linha que tem umfoo=
bit seguido por algo.Ou, mais curto, deixando o
s
comando reutilizar a expressão regular usada como endereço (e obviamente assumindo que não exigimos que haja nada depoisfoo=
de ),Ou, ainda mais curto, reconhecendo que o
s
comando não alteraria as linhas que não correspondem à expressão regular de qualquer maneira,Ou, sem
-n
, excluindo todas as linhas desinteressantes e modificando apenas as que são interessantes e contando com a saída padrão no final do ciclo,