Edição final após o exemplo adicionado à pergunta original:
Seu segundo comando sed com duas expressões '-e' funciona corretamente para mim na entrada de exemplo fornecida, usando o Debian Jessie / sed (GNU sed) 4.2.2. (Bem, na maioria das vezes. A última linha termina com 2 caracteres de comentário, mas isso não deve ser um grande problema.) Não tenho certeza se há alguma variação na maneira como diferentes versões de sed
tratam de múltiplas expressões?
Não é a minha solução preferida, mas se você está tendo problemas para obter o sed para se comportar de maneira previsível com várias expressões, você também pode usar tee
no final de um pipeline de comandos sed individuais.
sudo cat /etc/sudoers | { multiple sed commands in pipeline } | sudo tee /etc/sudoers
Primeiro edite depois de alguns esclarecimentos nos comentários:
Se a linha que você está adicionando for comentada antes da execução sed, então o primeiro regex está adicionando um segundo caractere de comentário a ela. Com dois caracteres '#' no início da linha, a segunda instrução não combina mais e não faz nada. Uma edição fácil é usar o modificador 1 ou mais no caractere '#' na segunda expressão:
sudo sed -e 's/.*wheel/#&/' -e 's/^#\+\s*\(%wheel\s\+ALL=(ALL)\s\+NOPASSWD:\s\+LOG_INPUT:\s\+LOG_OUTPUT:\s\+ALL\)//' /etc/sudoers
Resposta original:
Se eu não estou confundindo seus regexes, seu segundo comando é desfazer o primeiro. Como um exemplo simplificado:
echo a | sed -e 's/a/b/' -e 's/b/a/'
imprime a
. Várias expressões são executadas em seqüência para cada linha.
Uma opção seria usar um delimitador de comentário alternativo na primeira etapa e, em seguida, adicionar uma terceira etapa para substituí-la. Por exemplo, em vez de adicionar um '#' ao início da linha na primeira expressão, use 's/.*wheel/--&/'
. Em seguida, após a segunda expressão ter descomentado as linhas desejadas, adicione um terceiro -e 's/^--/#/'
para limpá-lo.