Simplificando uma expressão sed para salvar uma parte de uma linha de um arquivo em uma variável (bash)

0

Estou escrevendo um script que irá isolar uma parte de uma string e salvá-la em uma variável em um script bash. Assumindo que $INSTALL_INFO é uma variável com o arquivo do qual desejo extrair dados, estou fazendo algo assim.

 BOOST='cat $INSTALL_INFO | grep 'BOOST:' | sed 's/BOOST://g' | sed 's/^[ \t]*//''

Nesse caso, boost é a palavra-chave que estou procurando. O formato dos itens no arquivo é:

<possible whitespace><exact title><indeterminate whitespace><data I want><possible whitespace>

tem que haver uma maneira mais limpa de fazer isso com um comando sed, mas não consegui entender nada.

    
por mreff555 15.05.2018 / 21:01

1 resposta

1

A maneira de abordar isso é usar sed -n , que imprimirá apenas as linhas que correspondem à (s) expressão (ões) e uma expressão que descreva a linha inteira, mantendo apenas as partes desejadas.

BOOST=$(sed -n 's/^.*BOOST:[ \t]*\([^ \t]*\).*$//p' $INSTALL_INFO)

O trailing /p informa sed para imprimir a linha (após a substituição ter sido realizada).

Se os seus "dados que eu quero" puderem conter espaço em branco, fica um pouco mais complicado. Você tem que modificar a expressão para "mastigar" o espaço em branco no final da linha. Eu mudaria para o Perl para poder usar seu modificador "relutante" (um ? após um operador de repetição):

BOOST=$(perl -ne 'print if s/^.*BOOST:\s*(.*?)\s*$//' install_info.txt)

Claro, com o Perl você pode imprimir a parte que combina em vez de modificar a linha:

BOOST=$(perl -ne 'print $1 if /BOOST:\s*(.*?)\s*$/' install_info.txt)
    
por 15.05.2018 / 21:15

Tags