sed: como desabilitar o auto-impressão via arquivo de script em vez de usar a opção -n?

4

Eu tive uma confusão com esse tópico entre alternar entre a linha de comando e a interface do arquivo de script. Eu tinha um bom script escrito na linha de comando que funcionava, mas assim que eu queria salvá-lo em um arquivo .sed, lembrei que não podia mais usar o -n . Eu tentei usar o sinalizador '! D', mas não estou obtendo a mesma saída. Minha pergunta:
Existe uma maneira de colocar o -n em um arquivo .sed, ou alguma outra maneira de parar a impressão automática quando estou na interface do arquivo de script? Eu odeio ter que converter de proteger meu script do shell para não protegê-lo, mas eu acho que não há maneira de contornar isso?

    
por Nack 26.01.2017 / 21:54

3 respostas

9

A maneira padrão (POSIX) é ter #n no início do script. Eles precisam ser os dois primeiros bytes do script.

Isso impede o uso de um she-bang, que é usado apenas para scripts executados como sed -f the-script (note que she-bangs não são POSIX e POSIX não especifica o caminho dos utilitários), mas como @Kusalananda disse, ao usar uma she-bang, você sempre pode fazer:

#! /path/to/sed -nf

Se você quiser criar um script executável sed em sistemas que suportam she-bangs com argumentos (a maioria).

Observe que o #n também funciona na linha de comando, como em:

sed '#n
  s/foo/bar/p'

E você pode adicionar mais texto depois:

#no default output
s/foo/bar/p

Ou:

#nifty way to turn -n on
s/foo/bar/p

Na verdade, isso é algo para se ter em mente para evitar transformar -n em erro. É uma boa ideia usar um espaço depois de # nos comentários para isso (e para legibilidade).

# no, I don't want to turn -n on
s/foo/bar/
    
por 26.01.2017 / 22:40
2

sed [-e] 'command' e sed -f /path/to/script se comportam exatamente da mesma maneira em relação à opção -n . Se você deseja executar um script sed e desativar o comportamento "imprimir por padrão", use sed -n -f /path/to/script.sed /path/to/input .

    
por 26.01.2017 / 22:15
2

Você terá que executar o script sed usando

$ sed -n -f script.sed

ou altere a linha #! ("hash-bang") no script para algo como

#!/usr/bin/sed -nf

e execute-o com

$ ./script.sed
    
por 26.01.2017 / 22:28

Tags