Sed + como definir parâmetros no comando sed para exibir linhas do arquivo de texto

1

Eu acho o seguinte caminho para imprimir linha do arquivo

Neste exemplo, queremos imprimir a primeira linha do arquivo hosts

sed -n '1,1p'  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

Mas como fazer o mesmo com parâmetros dentro do comando sed

Por exemplo

Line_number=1
sed -n ' $Line_number,$Line_numberp'  /etc/hosts
 sed: -e expression #1, char 4: extra characters after command

o que está errado na minha sintaxe de sed?

    
por maihabunash 06.07.2014 / 15:46

3 respostas

1

Deixe seu shell expandir a variável usando "em vez de".

Exemplo:

victor@pyfg:~$ line_number=2
victor@pyfg:~$ sed -n "${line_number},${line_number}p" /etc/hosts
1.2.3.4 row-2

Como você está imprimindo apenas uma única linha, também pode fazê-lo assim:

victor@pyfg:~$ sed -n "${line_number}p" /etc/hosts
1.2.3.4 row-2
    
por 06.07.2014 / 16:00
0

apenas por diversão, uma solução awk:

awk -v line=2 'FNR==line' /etc/hosts
    
por 06.07.2014 / 17:56
0

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.

    
por 10.07.2014 / 12:28

Tags