O arquivo INI é o profiles.ini do Firefox . Quero imprimir tudo sob , incluindo os cabeçalhos de seção, onde os 's são inteiros não negativos, com uma linha em branco separando cada seção. Há também uma chave opcional sob que é diferente das chaves sob as seções de perfis, e quero imprimi-la também, se presente. Basicamente, o script de shell era apenas e antes (para imprimir as chaves e valores opcionais , , e ), mas isso falhará se as chaves forem adicionadas ou excluídas, e a opção de grep não for portátil.[Profile
n
]
n
Default
[Install*]
Default
grep -E 'Default=[^1]' profiles.ini
grep -A4 '^\[Profile' profiles.ini
Name
IsRelative
Path
Default
-A
Aqui está minha solução hackeada, que não é idiomática nem robusta para o AWK:
/^[[]Profile[0123456789]{1,}[]]$/ {
print
while ((getline) > 0) {
if ($0 ~ /^$/) { # Should really break on new sections.
print ""
break
} else {
print
}
}
}
/^Default=/ {
print # Default profile path given in the Install* section.
}
Exemplo de entrada:
[Profile2]
Name=default-test
IsRelative=0
Path=/home/user/ffprofiles/f9bwn86n.default-test
[Profile1]
Name=default
IsRelative=1
Path=x64qf7nv.default
Default=1
[Profile0]
Name=default-release
IsRelative=1
Path=9hv1fbkk.default-release-3426201712696
[General]
StartWithLastProfile=1
Version=2
[Install22379532B4E49482]
Default=9hv1fbkk.default-release-3426201712696
Locked=1
Exemplo de saída:
[Profile2]
Name=default-test
IsRelative=0
Path=/home/user/ffprofiles/f9bwn86n.default-test
[Profile1]
Name=default
IsRelative=1
Path=x64qf7nv.default
Default=1
[Profile0]
Name=default-release
IsRelative=1
Path=9hv1fbkk.default-release-3426201712696
Default=9hv1fbkk.default-release-3426201712696
Como posso fazer isso de forma mais concisa e correta? A solução não precisa estar em AWK, mas acho que awk é mais adequado neste caso do que sed ou qualquer outro utilitário Unix. A solução, no entanto, deve ser portátil e compatível com POSIX. Obrigado antecipadamente.