Preciso editar um arquivo como o seguinte:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
o objetivo é excluir as linhas que começam com 'iface ... inet6' e também excluir as próximas que começam com espaço (pode ser nenhuma ou mais de uma):
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
e mantenha o restante intacto para o seguinte resultado:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
Eu tentei com o sed usando o seguinte:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile
mas remove tudo, começando no lugar certo, mas apagando até o fim. Eu só quero remover as linhas que começam com espaço após o texto select iface.
text-processing
awk
sed
fcm
fonte
fonte
Respostas:
Tente esta adaptação do seu
sed
liner:Corresponde ao intervalo do seu primeiro padrão até a primeira linha NÃO começando com um caractere de espaço e exclui as linhas que começam com espaço ou um "i" (para o início
iface
). É necessário repensari
se necessário após o bloqueio.Parece que isso funciona:
Por favor, tente reportar.
fonte
Um script para padrão
sed
que usa um loop explícito para excluir as linhas:O script localiza as
inet6
linhas e, em seguida, anexa a próxima linha internamente no espaço do padrão (com um caractere de nova linha incorporado no meio). Em seguida, ele exclui o espaço do padrão até e inclusive o primeiro caractere de nova linha (isso exclui ainet6
linha original ). Ele continua fazendo isso até que o espaço do padrão não comece com um caractere em branco (espaço ou tabulação).Teste:
Teste em dados artificiais:
O script como "uma linha":
fonte
Você já tem boas respostas para a
sed
ferramenta, mas deixe-me propor outra abordagem, acredito muito mais simples, usandopcregrep
:O regex deve ser auto-explicativo - procuramos o padrão começando na linha
^iface.*inet6
e, em seguida, agrupamos qualquer caractere OU nova linha, seguido de um espaço simples repetido zero ou mais vezes. Em seguida, basta instruirpcregrep
para permitir a correspondência multi-linear com a-M
opção e inverter a coisa toda por-v
(a parte correspondente será removida).fonte
pcregrep
, muito mais intuitivo.