Há algumas boas respostas aqui,
mas vejo apenas um que incorpora a parte Val do problema,
e é ambíguo se isso está correto.
Concordo que awk é "uma ferramenta incrível", mas não é necessário aqui;
Eu acredito que este comando sed :
sed -n '/\[part1\]/,/\[part2\]/s/.*Val.*=//p' "$file"
provavelmente faz o que é desejado.
Como as outras soluções sed -e '/\[part1\]/,/\[part2\]/p'
( Networker
e Babyy ),
isso é trivialmente adaptável para selecionar qualquer seção.
(Você precisa, é claro, saber o nome dele; se você conhece apenas o seu número ordinal,
você pode adaptar a resposta de terdon
ou resposta de glenn jackman ,
Ambas as seções contam , em vez de procurar um nome específico.
Se você não sabe o nome da seção seguinte, você pode fazer
sed -n '/\[part42\]/,/\[part/s…' "$file"
por exemplo.
Minha única meta pergunta é sobre a parte cut -d'=' -f2 da pergunta.
Se uma linha de entrada da qual estamos extraindo dados contiver vários caracteres =
depois de Val (ou seja, o valor do campo contém = caractere (s)), por exemplo,
Einstein.Val = E=mc^2
, o comando cut acima extrairá apenas o texto entre o primeiro e o segundo =
(isto é, o valor do campo, até (mas não incluindo) o primeiro = ), por exemplo, E .
O comando sed que eu apresentei acima extrairá apenas o texto
após o último = (por exemplo, mc^2 ).
Para obter tudo após o primeiro = (por exemplo, E=mc^2 ), use
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=//p' "$file"
Para imitar o comportamento do cut (por exemplo, E ), use
sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=\([^=]*\).*//p' "$file"
Observe que minha abordagem pressupõe que os dados parecem
pelo menos geralmente como a ilustração na pergunta;
Ou seja, pelo menos um = aparece em algum lugar à direita da string Val .
Assim, todas as minhas soluções irão ignorar a entrada como
Girl.Name = Valerie
Valerie Bertinelli
mesmo se estiver entre [part1] e [part2] .