torr - substitua linhas complexas em um arquivo usando variáveis

0

Como faço para substituir uma linha complexa em um arquivo usando sed?

Por exemplo, eu quero substituir uma regra do udev em /etc/udev/rules.d/70-persistent-net.rules.

Isso não funciona:

OLD_RULE='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'

NEW_RULE='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'


sed -i "s/$OLD_RULE/$NEW_RULE/g" /etc/udev/rules.d/70-persistent-net.rules

O arquivo permanece inalterado.

    
por don_crissti 02.07.2013 / 16:10

2 respostas

1

Você precisará escapar de todos os caracteres em OLD_RULE que podem ser interpretados como caracteres mágicos de padrão. Ou, mais simplesmente, use um padrão para combinar com a linha que você deseja operar e, em seguida, execute apenas a substituição mínima que você realmente precisa.

Algo como (não testado) sed -i '/, NAME="eth1"/s/eth1/eth0/' /etc/udev/rules.d/70-persistent-net.rules talvez.

    
por 02.07.2013 / 16:17
0

Algo que pode funcionar às vezes (e que funciona aqui neste exemplo específico) é usar a capacidade de citação de printf e sed -r :

old_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'
new_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'
printf -v sed_repl 's/%q/%q/g' "$old_rule" "$new_rule"
sed -r -i "$sed_repl" /etc/udev/rules.d/70-persistent-net.rules
    
por 03.07.2013 / 21:06