sed para incluir caracteres em linhas [RESOLVIDO]

1. sed para incluir caracteres em linhas [RESOLVIDO]

Dorival Junior
dorivaljunior

(usa Debian)

Enviado em 07/11/2013 - 09:08h

Tenho um arquivo com conteúdo similar a este:

----conteudo do arquivo----
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints 1 asdf
aa with linespoints 2 asdf
bla with linespoints asdf
aa with linespoints 3 asdf
---------------------------

O que preciso:
SUBSTITUIR as expressões "with linespoints [algum numero]" por "with linespoints lc [algum numero]".

Veja que as linhas com "with linespoints" sozinho não devem ser alteradas, mas APENAS as linhas que contem "with linespoints 2" ou outro número por exemplo.

Resumindo:
texto "with linespoints" --não altera--> "with linespoints"
texto "with linespoints 2" --altera------> "with linespoints lc 2"
texto "with linespoints 3" --altera------> "with linespoints lc 3"

Aguardo a ajuda dos colegas.


  


2. MELHOR RESPOSTA

Fernando
phoemur

(usa FreeBSD)

Enviado em 07/11/2013 - 21:41h

é mais fácil com sed mesmo na minha opinião


sed '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt


veja a saída do arquivo normal e do comando:


phoemur ~/bash/teste $ cat arquivo.txt
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints 1 asdf
aa with linespoints 2 asdf
bla with linespoints asdf
aa with linespoints 3 asdf
phoemur ~/bash/teste $ sed '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints lc 1 asdf
aa with linespoints lc 2 asdf
bla with linespoints asdf
aa with linespoints lc 3 asdf


Agora o comando anterior imprime na tela apenas, se quiser EDITAR o arquivo, utilize a opção -i do sed:


sed -i '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt


3. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 07/11/2013 - 13:09h

Da pra fazer sim, ja conseguiu iniciar algo?
Pelo meu visto tem q utilizar um looping pra ler linha a linha e um if pra checar se a linha que vc quer contém um número após o linespoints.


4. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 07/11/2013 - 13:26h

Segue,

Agora no lugar do "Fazer a substituição" vc coloca um sed pra substituir



cat file.txt | while read line
do

echo "$line" | grep linespoints &> /dev/null
if [ $? -eq 0 ]; then

LINHA=`echo "$line" | awk -F"linespoints" '{print $2}' | sed 's/ //g' ` &> /dev/null
echo $LINHA | grep ^[0-9] &> /dev/null
if [ $? -eq 0 ]; then

echo "Fazer a substituicao em $line"

else

echo "Nao fazer nada em $line"

fi

fi

done



Qualquer dúvida posta aí ..


5. específico do SED

Dorival Junior
dorivaljunior

(usa Debian)

Enviado em 07/11/2013 - 14:15h

Olá alexandre, toda ajuda é bem vinda. Na verdade as coisas podem ser bem mais simples !!

Veja o que fiz até o momento:
sed s/'with linespoints [1-9]'/'with linespoints [1-9]'/ ARQUIVO.TEXTO

Só com esta linha, eu verifico em todas as linhas do arquivo e ele encontra a expressão a ser substituída. Porém a dúvida é como inserir o novo valor, pois da forma que eu fiz, ele insere a string "[1-9]" e não o valor numerico que estava antes. Então a dúvida é na sintaxe do comando sed, sem uso de scripts.

De qquer forma valeu a ajuda aí !

att.,





alexandregms escreveu:

Segue,

Agora no lugar do "Fazer a substituição" vc coloca um sed pra substituir



cat file.txt | while read line
do

echo "$line" | grep linespoints &> /dev/null
if [ $? -eq 0 ]; then

LINHA=`echo "$line" | awk -F"linespoints" '{print $2}' | sed 's/ //g' ` &> /dev/null
echo $LINHA | grep ^[0-9] &> /dev/null
if [ $? -eq 0 ]; then

echo "Fazer a substituicao em $line"

else

echo "Nao fazer nada em $line"

fi

fi

done



Qualquer dúvida posta aí ..





6. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 07/11/2013 - 14:44h

Então, mas no caso que ele deve substituir somente a linha que contém um número após o linespoints, o buraco fica mais embaixo.
Se há algum parâmetro no sed que faz isso, eu desconheço.
De qualquer forma acabei de incrementar no script a linha do sed que substitui a linha específica. A saída será gerada no final da execução do script e vc pode enviar para um novo arquivo texto:
O seu arquivo texto você substitui pelo file.txt conforme comentado no script:


#!/bin/bash

# Substituir o seu arquivo texto no lugar de file.txt
cat file.txt | while read line
do

echo "$line" | grep linespoints &> /dev/null
if [ $? -eq 0 ]; then

LINHA=`echo "$line" | awk -F"linespoints" '{print $2}' | sed 's/ //g' ` &> /dev/null
echo $LINHA | grep ^[0-9] &> /dev/null
if [ $? -eq 0 ]; then

#echo "Fazer a substituicao em $line"
SUB=`echo $line | sed 's/linespoints/linespoints lc/g' `
echo $SUB

else

echo "$line"

fi

fi

done







7. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Dorival Junior
dorivaljunior

(usa Debian)

Enviado em 07/11/2013 - 16:09h

Olá Alexandre, valeu a ajuda, mas esta solução não resolve meu problema.

Usando o script seu, ou a minha linha sed, ambos dão o mesmo resultado, e nenhum deles faz a substituição que eu preciso.
Acredito que a solução ainda seja no comando SED puro.
Mas valeu. Vamos continuar tentando.



alexandregms escreveu:

Então, mas no caso que ele deve substituir somente a linha que contém um número após o linespoints, o buraco fica mais embaixo.
Se há algum parâmetro no sed que faz isso, eu desconheço.
De qualquer forma acabei de incrementar no script a linha do sed que substitui a linha específica. A saída será gerada no final da execução do script e vc pode enviar para um novo arquivo texto:
O seu arquivo texto você substitui pelo file.txt conforme comentado no script:


#!/bin/bash

# Substituir o seu arquivo texto no lugar de file.txt
cat file.txt | while read line
do

echo "$line" | grep linespoints &> /dev/null
if [ $? -eq 0 ]; then

LINHA=`echo "$line" | awk -F"linespoints" '{print $2}' | sed 's/ //g' ` &> /dev/null
echo $LINHA | grep ^[0-9] &> /dev/null
if [ $? -eq 0 ]; then

#echo "Fazer a substituicao em $line"
SUB=`echo $line | sed 's/linespoints/linespoints lc/g' `
echo $SUB

else

echo "$line"

fi

fi

done









8. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 07/11/2013 - 17:13h

Cara, a saída que ele retorna é esta:


[user1@TUX new]$ ./script.sh
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints lc 1 asdf
aa with linespoints lc 2 asdf
bla with linespoints asdf
aa with linespoints lc 3 asdf


Não seria isso a saída desejada?



9. Re: sed para incluir caracteres em linhas [RESOLVIDO]

Dorival Junior
dorivaljunior

(usa Debian)

Enviado em 08/11/2013 - 08:50h

Perfeitamente, o SED é muito mais prático. Com uma linha podemos fazer a vez de um script, e reduzir muito código.

Era exatamente isto que eu procurava. Obrigado pela solução !!!!
phoemur escreveu:

é mais fácil com sed mesmo na minha opinião


sed '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt


veja a saída do arquivo normal e do comando:


phoemur ~/bash/teste $ cat arquivo.txt
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints 1 asdf
aa with linespoints 2 asdf
bla with linespoints asdf
aa with linespoints 3 asdf
phoemur ~/bash/teste $ sed '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt
23 with linespoints , asdf
bla 22 with linespoints a asdf
asdf bla bla blaee with linespoints lc 1 asdf
aa with linespoints lc 2 asdf
bla with linespoints asdf
aa with linespoints lc 3 asdf


Agora o comando anterior imprime na tela apenas, se quiser EDITAR o arquivo, utilize a opção -i do sed:


sed -i '/with linespoints [1-9]/s/^\(.*with linespoints\)\(.*\)$/\1 lc\2/g' arquivo.txt









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts