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]
.