com sed, como posso substituir a palavra em uma linha correspondente?

4

Estou tentando gravar uma expressão sed para detectar linhas semelhantes a esta:

s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux

e substitua o ttys0 por something_else

Eu não quero detectar linhas comentadas (começando com # )

Eu posso substituir a linha inteira, mas como eu simplesmente substituo a substring, deixando o restante da linha intacta?

    
por starfry 11.09.2012 / 16:57

3 respostas

8

Uma maneira de fazer isso é a seguinte:

echo 's0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux' | 
    sed -e '/^[^#]/ s/ttyS0/foo/'
    
por 11.09.2012 / 17:11
0

Corresponda a parte antes de ttyS0 e depois de ttyS0, verifique também se a linha não começa com # :

sed 's/^[^#]\(.*\)ttyS0\(.*\)/something/'

Resultado:

%> echo "s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux" | sed 's/^[^#]\(.*\)ttyS0\(.*\)/something/'
0:12345:respawn:/sbin/agetty -8 -s 115200 something linux
    
por 11.09.2012 / 17:02
0

Se sempre começar com s[number]colon você poderia fazer (com o GNU sed):

sed -r '/^s[0-9]+:/s/ttyS0/something_else/' infile

Que altera qualquer linha que comece com o regex, adapte-se para atender às suas necessidades.

    
por 11.09.2012 / 17:41