sed - extrai o valor por substituição da primeira linha correspondente à segunda linha de expressão regular encontrada com a primeira regexp

0

Dado um arquivo TestData.txt contendo linhas, onde o lixo pode ser repetido N ou mais vezes, e a posição da linha "Model = Default" não é fixa

...
junk
junk

Model="C"
junk
junk
Size="81"
junk

Model="Default"   <---- Start of "Default" block
junk
...
junk
Size="47"         <---- Required value of size (first "Size=" line after "Default")
junk
junk

Model="A"
junk
Size="22"
junk
junk

Model="T"
junk
junk
Size="32"
junk
...

e desejando extrair o valor de Tamanho para o caso Padrão, o seguinte trabalha imprimindo as linhas entre as correspondências e, em seguida, aplicando um segundo comando sed para fazer a substituição para extrair o valor de tamanho.

sed -ne '/="Default"/,/Size=/p' TestData.txt | sed -ne 's|Size="\([1-9][0-9]*\)"||p'

Isto imprime 47 , o valor requerido do parâmetro "Size" da seção "Default".

As duas operações sed podem ser combinadas em uma invocação de sed mais simples?

(Esta é uma forma simplificada da tarefa real que é extrair, com regexps mais complicados, um único valor de um arquivo de configuração onde há vários blocos contendo uma designação de "tamanho").

    
por J G Miller 23.01.2017 / 02:48

1 resposta

2

Você deve poder adicionar o segundo filtro como uma subexpressão entre chaves

sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"//p}' TestData.txt

ou POSIXly

sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"//p
}' TestData.txt

Veja os Comandos de edição no sed

[2addr] {function
function
...
}

Execute a list of sed functions only when the pattern space is selected. The list of sed functions shall be surrounded by braces and separated by newlines, and conform to the following rules. The braces can be preceded or followed by blanks. The functions can be preceded by blanks, but shall not be followed by blanks. The right-brace shall be preceded by a newline and can be preceded or followed by blanks.

    
por 23.01.2017 / 03:33