Editar uma linha específica depois da ocorrência de uma palavra. [RESOLVIDO]

1. Editar uma linha específica depois da ocorrência de uma palavra. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 15/03/2017 - 19:21h

Supondo que eu quero editar a linha que contem a palavra "Banana" no arquivo abaixo, mas somente a linha que vem depois da palavra "Melancia". Como faço isso usando "sed" ou "awk"?

Laranja
Banana
Melancia
Banana



  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2017 - 18:31h

Melhorei aqui. Você vai ter que otimizar para quando tiver mais ocorrências.

$ cat /tmp/fruta.txt
Laranja
Banana
Melancia
teste1
teste2
teste3
Banana
Morango
Banana

#!/bin/bash

ARQ="/tmp/fruta.txt"
REF="Melancia"
LINHAS=$(wc -l < $ARQ)
COUNT=$(grep -n $REF $ARQ | cut -d ':' -f 1)

while [ $COUNT -le $LINHAS ]
do
FRUTA=$(sed -n ${COUNT}p $ARQ)
if [[ $FRUTA == "Banana" ]]
then
sed -i "$COUNT s/.*/ESTA LINHA FOI ALTERADA/" $ARQ
exit
else
echo "PULAR"
fi
COUNT=$(( $COUNT + 1 ))
done


$ cat /tmp/fruta.txt
Laranja
Banana
Melancia
teste1
teste2
teste3
ESTA LINHA FOI ALTERADA
Morango
Banana


3. Re: Editar uma linha específica depois da ocorrência de uma palavra. [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/03/2017 - 10:58h

PauloHAC escreveu:

Supondo que eu quero editar a linha que contem a palavra "Banana" no arquivo abaixo, mas somente a linha que vem depois da palavra "Melancia". Como faço isso usando "sed" ou "awk"?

Laranja
Banana
Melancia
Banana


Bom dia Paulo.
Verifique se atende as necessidades:

nl=$(grep -n 'Banana' frutas.txt|awk -F: 'END{print$1}')
sed -i "${nl}s/.*/ESTA LINHA FOI ALTERADA/" frutas.txt

Marcelo Oliver



4. Re: Editar uma linha específica depois da ocorrência de uma palavra.

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2017 - 11:40h

msoliver escreveu:

PauloHAC escreveu:

Supondo que eu quero editar a linha que contem a palavra "Banana" no arquivo abaixo, mas somente a linha que vem depois da palavra "Melancia". Como faço isso usando "sed" ou "awk"?

Laranja
Banana
Melancia
Banana


Bom dia Paulo.
Verifique se atende as necessidades:

nl=$(grep -n 'Banana' frutas.txt|awk -F: 'END{print$1}')
sed -i "${nl}s/.*/ESTA LINHA FOI ALTERADA/" frutas.txt

Marcelo Oliver


Grande Marcelo,

Pelo que entendi a palavra "Melancia" deve ser referência.

Creio que tenham formas mais simples, mas fiz algumas alterações no seu script.

$ cat fruta.txt
Laranja
Banana
Melancia
Banana
Morango
Banana


#!/bin/bash

PALAVRA="Melancia"
FRUTA=$(grep $PALAVRA -A 1 fruta.txt | tail -1)
NL=$(grep -n $PALAVRA -A 1 fruta.txt | tail -1 | cut -d '-' -f 1)

if [[ $FRUTA == "Banana" ]]; then sed -i "$NL s/.*/ESTA LINHA FOI ALTERADA/" fruta.txt; else echo 'Nao encontrado'; fi



5. Re: Editar uma linha específica depois da ocorrência de uma palavra. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2017 - 12:43h

Esse script não está bom. ;)

Estou contando apenas com uma ocorrência.






6. Re: Editar uma linha específica depois da ocorrência de uma palavra. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2017 - 12:55h

Quase lá, galera! O exemplo das frutas foi só pra simplificar as coisas e deixar mais didático a questão. Mas pensem em algo mais genérico que funcionaria para arquivos mais complexos, com muito mais texto. O que eu preciso é ter uma palavra como referência para encontrar outra depois dela (a primeira ocorrência de preferência). Então deixem eu colocar mais lenha na fogueira...

Laranja
Banana
Limão
Melancia <--- referência
...
número variável de linhas
...
Banana <--- linha a ser editada
Morango
Banana



7. Re: Editar uma linha específica depois da ocorrência de uma palavra.

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2017 - 18:25h

Resolvi da seguinte maneira...

$ cat frutas.txt 
Laranja
Banana
Melancia
Cereja
Banana
Morango
Banana

$ grep -n -A 20 "Melancia" frutas.txt | grep -m 1 "Banana" | cut -d '-' -f 1
5

$ sed '5s/$/ LINHA ALTERADA/' frutas.txt Laranja
Banana
Melancia
Cereja
Banana LINHA ALTERADA
Morango
Banana


O primeiro conjunto de comandos com GREP me retorna o número da linha que preciso editar. Depois uso o SED para adicionar um texto no final dessa linha. Funcionou, mas se alguém tiver uma solução mais "elegante", por favor compartilhe ;-)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts