Sed colocando texto após uma determinada linha

0

Eu li na manpage de Sed, mas eu ainda acho isso bastante confuso, então eu espero encontrar algumas respostas aqui:)

Eu preciso editar um arquivo usando um script bash.

Eu preciso colocar algumas linhas depois de uma linha específica dentro do grub.cfg. Para o propósito de mostrar um exemplo, adicionarei 5 linhas recém-adicionadas.

Original:

if loadfont /boot/grub/font.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "Install Ubuntu Server" {
    set gfxpayload=keep
    linux   /install/vmlinuz  file=/cdrom/preseed/ubuntu-server.seed quiet ---
    initrd  /install/initrd.gz
}
menuentry "OEM install (for manufacturers)" {
    set gfxpayload=keep
    linux   /install/vmlinuz  file=/cdrom/preseed/ubuntu-server.seed quiet oem-config/enable=true ---
    initrd  /install/initrd.gz
}

Depois da edição:

if loadfont /boot/grub/font.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
newly_addedd_line_1
newly_addedd_line_2
newly_addedd_line_3
newly_addedd_line_4
newly_addedd_line_5

menuentry "Install Ubuntu Server" {
    set gfxpayload=keep
    linux   /install/vmlinuz  file=/cdrom/preseed/ubuntu-server.seed quiet ---
    initrd  /install/initrd.gz
}
menuentry "OEM install (for manufacturers)" {
    set gfxpayload=keep
    linux   /install/vmlinuz  file=/cdrom/preseed/ubuntu-server.seed quiet oem-config/enable=true ---
    initrd  /install/initrd.gz
}

Como isso funcionaria usando sed? Idealmente, eu teria todas as novas linhas dentro de uma nova variável de script.

Por exemplo:

LINES_TO_ADD='newly_addedd_line_1\n
newly_addedd_line_2\n
newly_addedd_line_3\n
newly_addedd_line_4\n
newly_addedd_line_5'

Obrigado antecipadamente!

    
por Konstantin Hadzhiev 11.07.2017 / 17:43

3 respostas

1
sed '/^set menu_color_highlight/a\
newly_addedd_line_2\
newly_addedd_line_3\
newly_addedd_line_4\
newly_addedd_line_5' /path/to/file

Depois de verificar a saída, você pode usar sed --in-place ou gravar em um novo arquivo e trocar a versão antiga.

Do manual:

 [1addr]a\
 text    Write text to standard output immediately before each attempt to read
         a line of input, whether by executing the ''N'' function or by beginning
         a new cycle.

Possivelmente um pouco mais robusto, você pode colocar seu novo bloco de texto em um arquivo (por exemplo, newlines ) e, em seguida, usar:

sed '^set menu_color_highlight/r newlines' /path/to/input.

Mais uma vez, no manual:

 [1addr]r file
         Copy the contents of file to the standard output immediately before the
         next attempt to read a line of input.  If file cannot be read for any
         reason, it is silently ignored and no error condition is set.
    
por 11.07.2017 / 17:52
0

Se o número de linha específico nunca mudar, você poderá usar algo como:

sed -i '11inewly_addedd_line_1 \
newly_addedd_line_2 \
newly_addedd_line_3 \
newly_addedd_line_4 \
newly_addedd_line_5' /path/to/your/grub.cfg

e você pode checar que ele fará o que você quer primeiro simplesmente não incluindo o sinalizador '-i' (sem ele, isso irá imprimir o arquivo com suas mudanças, mas não irá realmente alterar o arquivo) .

Se você quiser adicioná-lo após uma correspondência de padrão e o padrão que você está colocando contiver a linha inteira, você poderá fazer isso:

sed -i '/set menu_color_highlight=black\/light-gray/a \
newly_addedd_line_1 \
newly_addedd_line_2 \
newly_addedd_line_3 \
newly_addedd_line_4 \
newly_addedd_line_5' /path/to/your/grub.cfg

Onde / PATTERN / a significa acrescentar após o padrão.

Você também pode adicionar coisas antes de uma linha usine / PATTERN / i para inserir.

Espero que isso ajude!

    
por 11.07.2017 / 17:55
0
LINES_TO_ADD='newly_addedd_line_1
newly_addedd_line_2
newly_addedd_line_3
newly_addedd_line_4
newly_addedd_line_5'
LINES_TO_ADD_ESC=$(printf '%s\n' "$LINES_TO_ADD" | sed 's:[\/&]:\&:g;$!s/$/\/')
sed -e "
        /^set menu_color_highlight=/G
        //s/\$/$LINES_TO_ADD_ESC/
"
    
por 11.07.2017 / 19:16