Como posso substituir a string de várias linhas usando sed? [fechadas]

2

Eu tentei o seguinte comando: -

[root@10 bin]# cat temp
asdjahskjdhajksdhjkashjahfksjdhfkjsddhflkdsjhfklsdajhfklajshdkjalsdlkjasdhkljas
hskdajkdhkjas
 cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id [ string range $recv 42 43 ]

[root@10 bin]# sed -ir '/^cast \$recv \$UE_CAPABILITY_ENQUIRY$/{$!{N;s/^cast \$recv \$UE_CAPABILITY_ENQUIRY\nset trans_id \[ string range \$recv 42 43 \]$/cast \$recv \$UE_CAPABILITY_ENQUIRY \nset trans_id 1/;ty;P;D;:y}}' temp

Eu quero substituir

 cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id [ string range $recv 42 43 ]

com

cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id 1

Mas o comando acima não está funcionando. Algum corpo pode apontar meu erro?

    
por Priyatosh Rai 17.06.2016 / 11:34

1 resposta

3

Como você não está realmente alterando a linha "cast":

sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
                set trans_id 1
n;d}' file

Como Kusalananda comenta, este comando:

  • quando uma das linhas "cast" desejadas for encontrada:
    • a ppend a nova linha
    • pegue a linha n ext do arquivo (a linha indesejada "set")
    • e d elete

Em retrospectiva, isso não confirma que a linha de exclusão é aquela que você deseja excluir. Eu mudaria isso para:

sed '
    /cast \$recv \$UE_CAPABILITY_ENQUIRY/ {
        n
        /set trans_id \[ string range \$recv 42 43 \]/ {
            i\
                set trans_id 1
            d
        }
    }
' file

Para arquivos recursivamente:

find . type f | xargs sed -i '' -e '...'

Com ferramentas GNU, com mais segurança

find . type f -print0 | xargs -0 sed -i '' -e '...'
    
por 17.06.2016 / 12:21