Dadas entradas no formato de
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 dcf03c24-3d0d-4581-be1d-67b90f92a2c1
else
search --no-floppy --fs-uuid --set=root dcf03c24-3d0d-4581-be1d-67b90f92a2c1
fi
linux /boot/vmlinuz-5.4.0-33-generic root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro net.ifnames=0
initrd /boot/initrd.img-5.4.0-33-generic
. . .
if test x$grub_platform = xpc; then
linux_suffix=16;
else
linux_suffix= ;
fi
ATUALIZAR:
Eu não deixei claro no começo. A pergunta Quando o recurso_platform_search_hint do grub2 pode ser "Não" tem mais informações. Ou seja, existem outras instruções if, e eu quero apenas processar feature_platform_search_hint
uma. Colocando outro if
caso acima agora.
Eu quero que eu sed
escolha o primeiro search
comando sob a feature_platform_search_hint
condição enquanto ignora/exclui todo o if
bloco de comando:
set root='hd0,gpt3'
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 dcf03c24-3d0d-4581-be1d-67b90f92a2c1
linux /boot/vmlinuz-5.4.0-33-generic root=UUID=dcf03c24-3d0d-4581-be1d-67b90f92a2c1 ro net.ifnames=0
initrd /boot/initrd.img-5.4.0-33-generic
As linhas restantes/restantes estão intactas.
Aqui está o sed
comando que eu inventei:
/feature_platform_search_hint/{
# remove if line and keep next
d; N; h;
# remove else block
N; N; N; d;
g; s/ search /search /;
}
Mas não está funcionando como eu esperava.
Por que e como corrigir? THX
/^ *if
em suas linhas acima, você tem espaços em branco, portanto, espaço em branco e asterisco antes de 'se'.
Eu não sei se o seu arquivo tem eles realmente. Mas mesmo que tenha, este código acima deve funcionar.
else *$/
efi *$
espaço em branco após 'else' e 'fi' para proteção se alguém acidentalmente adicionar espaço após eles ... Também a linha pode começar com, digamos em outro lugar , então ...
Simplesmente substituir a
if
instrução porif true; then
criaria um código shell com o mesmo efeito.Isso substitui a
if
instrução, mas deixa o código original intacto em um comentário.Encontrei minha solução -- não pode usar
d
, que iniciará o próximo ciclo imediatamente, deixando o restante dos comandos não processados.