Estou tentando usar o sed em um script para modificar uma linha no meu arquivo de configuração do grub ( /boot/grub/grub.cfg
) toda vez que o grub é atualizado. Desejo substituir a seguinte linha:
menuentry "Kali GNU/Linux"
com isso:
'menuentry "Kali GNU/Linux" --class kali'
A linha em /boot/grub/grub.cfg é a seguinte:
menuentry "Kali GNU/Linux" --class gnu-linux --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-5.14.0-kali2-amd64--7afb9c25-9d47-4ce4-a3dd-635aa0b04d7a'
Basicamente, o que eu quero fazer é adicionar a linha --class kali
. Não posso substituir gnu-linux
ou os
com kali
, pois essas palavras ocorrem várias vezes.
O script que usei é o seguinte:
TARGET_STRING='menuentry "Kali GNU/Linux"'
NEW_STRING='menuentry "Kali GNU/Linux" --class kali'
sudo sed -i "s/$TARGET_STRING/$NEW_STRING/g" /boot/grub/grub.cfg
Isso não funciona, dando o seguinte erro:
sed: -e expression #1, char 32: unknown option to `s'
Encontrei soluções on-line para substituir uma string contendo espaços aqui e substituir uma string contendo aspas duplas aqui , mas não quando uma string contém ambos.
Alguém por favor poderia me ajudar?
Obs: estou usandoGNU sed 4.7
Não há necessidade de variáveis. Basta usar as strings diretamente:
Você está recebendo os erros porque suas strings contêm
/
e você estava usando/
como separador nos///
operador. Você pode usar qualquer caractere para isso, e é por isso que estou usandos|||
acima. Em geral, você precisa escolher um caractere que não esteja presente no$target_string
arquivo$new_string
. Então|
funciona neste exemplo, mas você pode precisar escolher outro para outros casos.Você pode usar variáveis se você realmente quiser, elas simplesmente não estão ajudando aqui. Além disso, como regra geral, é melhor evitar nomes de variáveis CAPITAL em scripts de shell. Isso funcionaria embora: