sed: substituir parte do texto na linha anterior se a correspondência for encontrada [duplicada]

0

Desejo substituir create_test no arquivo por #create_test se a próxima linha contiver psfxxx_16_pi . Como posso fazer isso com o sed para todo o arquivo que contém isso?

Conteúdo do arquivo de entrada:

create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

Arquivo de saída:

#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }
    
por mandrake00 16.11.2018 / 10:07

3 respostas

2

Tente

sed '/^create_test/ {N; /psfxxx/ s/^/#/}' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

create_test -type hard -outer { 1.0000 } { \
    vsfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    vsfxxx_16_pi/psfop/deadline_south_re_1 }

Ao encontrar "create_test", ele anexa a próxima linha, e se ela contiver "psfxxx", ele será o prefixo "#".

    
por 16.11.2018 / 10:26
0

Outro método sed :

$ sed -zE 's/create_test([^\n]*\n[^\n]*psfxxx_16_pi)/#create_test/g' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 
    
por 16.11.2018 / 10:31
0

Se o awk funcionar:

awk '/psfxxx_16_pi/{prev = "#" prev} {print prev} {prev = $0} END {print}'

Aqui, imprimo a linha anterior (salva em prev ) para cada linha e salvo $0 para a próxima iteração em prev . Se a linha corresponder, adiciono # a prev . No final, imprima a última linha.

    
por 16.11.2018 / 10:33

Tags