Provavelmente, é melhor, em seu caso de exemplo, ter sed q
uit o arquivo de entrada depois de encontrar os dados impressos desejados. Por exemplo:
sed 1q <INPUT
Isso irá imprimir automaticamente a primeira linha e depois finalizar o processo. Você também pode fazer:
head -n1 <INPUT
... para obter o mesmo efeito.
sed
também interpreta address,ranges
, e estes podem ser /regex/,/addresses/
ou combinações dos dois tipos também. Por exemplo:
sed '9q;/LINE[0-9]/,/^$/!d' <<FILE
$(printf 'LINE %s\nLINE%s\nLINE %s\nNOT LINE %s\n\n' $(seq 32))
FILE
###OUTPUT###
LINE2
LINE 3\nNOT LINE 4
LINE6
LINE 7\nNOT LINE 8
LINE 9
No exemplo acima, sed
d
elimina qualquer linha que encontre que !
não ocorra entre uma linha contendo a string LINE
imediatamente seguida por [0-9]
- ou qualquer caractere numérico - e uma linha não contendo /^$/
de qualquer caractere - ou uma linha em branco. Desta forma, as linhas 1 e 5 - ou LINE [15]
são removidas de sua saída. No entanto, por outro lado, LINE 9
é impresso porque é instruído a q
em 9, portanto, ele interrompe o processamento de seu script nesse ponto - o que ocorre antes do filtro que o excluiria.
Como sugerido em outra resposta, manipular parâmetros variáveis é tão simples quanto permitir que o shell os expanda para você - então você deve usar "$ parameter" para fazer isso. É importante lembrar que a entrada inválida será tratada como tal. Por exemplo, pela mesma razão:
echo "///" | sed 's////g'
sed: -e expression #1, char 5: unknown option to 's'
... também não faz:
v=/ ;echo "///" | sed "s/$v//g" :(
sed: -e expression #1, char 5: unknown option to 's'
O valor de cada variável deve ser válido em sed
script e não pode conter seus caracteres delimitadores.