br comando dentro do sed

4

É possível executar o comando sed dentro de sed , algo assim:

sed -i.bak -e '${sed -n 1,1p file.txt},$d' output.file

Eu quero a primeira linha de file.txt , que é o número a ser o parâmetro de entrada para output.file , onde todas as linhas depois dessa linha serão excluídas.

    
por ipsilon 04.02.2015 / 10:29

1 resposta

5

Isso não é um comando sed dentro de sed , é apenas um substituto que seu shell faz antes de realmente chamar sed . Basta usar aspas e parênteses adequados e pronto:

sed -i.bak -e "$(sed -n 1,1p file.txt),\$d" output.file

Aspas duplas permitem a substituição do processo dentro (aspas simples não) e a sintaxe $() significa que o resultado do comando interno é capturado e substituído. Observe que \$ teve que ser salvo para evitar que $d seja interpretado como uma variável.

Uma maneira menos confusa de escrever a mesma coisa seria

n=$(sed -n 1,1p file.txt)
sed -i.bak -e "${n}\$d" output.file

Você também pode escrevê-lo como "${n}"',$d' , em bash você pode concatenar cadeias de caracteres diferenciadas entre aspas (incluindo strings sem aspas) simplesmente colocando-as uma ao lado da outra.

Além disso, você pode querer escrever sed -n '1{p;q}' file.txt . Primeiro de tudo, você não precisa escrever um intervalo se você especificar apenas um número de linha. Em segundo lugar, se você sair depois de imprimir a primeira linha ( q ), ele não lê o arquivo inteiro sem motivo - mais eficiente. Porque é uma primeira linha, -n também pode ser omitido. Ou você poderia usar head -n1 file.txt .

    
por 04.02.2015 / 10:36

Tags