Inseri texto em um arquivo [RESOLVIDO]

1. Inseri texto em um arquivo [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 16/08/2016 - 17:57h

pessoas .. tô apanhando para conseguir a parada aqui

preciso inserir um texto em um arquivo ( arquivo.txt )... digamos "novo texto" ... só que preciso colocar ele na linha de baixo depois da última ocorrência de uma string, ou colocar o texto uma linha acima da primeira ocorrência de outra string.

Consigo identificar as ocorrencias e tb consigo inserir um texto, a guerra está sendo para juntar os dois comandos, deem um help !!

ex:
mauricio@Phantom:~/área de trabalho$ cat arquivo.txt
a
a
a
a
a
b
b
c
c
mauricio@Phantom:~/área de trabalho$


Preciso inserir um texto ou antes do primeiro "b" ou depois do último "a"



  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/09/2016 - 20:08h

Mauriciodez escreveu:

marcelo ... o comando não funcionou não ... até funcionou só com as letras, mas quando testei no arquibo real ele inseriu no lugar errado.

NLin=$(egrep -n -m1 'b' arq.txt |cut -d: -f1) ; sed -i "${NLin}i\Aqui vai um texto" arq.txt 


se o arquivo tiver só a, b, c, d etc nas linhas funciona, mas vamos supor que o arquivo esteja assim já não funciona

a - a lua é um quadrado
a - a lua é uma bola
a - a terra é terra
b - seria se fosse
b - bom não é ruim
b - mil novecentos e la vai pedrinha
c - nada a ver
d - campos sale
d - quase sem querer


na verdade nenhum deles funciona
___________________________________________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

-----------------------------------------------------------------------------------------------------------
Mauricio, funciona sim!!!!
Com uma pequena alteração . . .
Para CASAR a LETRA INICIAL, faça:
NLin=$(egrep -n -m1 '^b' arquivo.txt |cut -d: -f1) ; sed -i "${NLin}i\Aqui vai um texto" arquivo.txt 

A PEQUENA ALTERAÇãO e esse "^" antes do "b", que indica começo de linha.
NLin=$(egrep -n -m1 '^b' arquivo.txt |cut -d: -f1) ==> " RESOLVE os Comando que estão entre parêntesis, e atribui o resultado para a VAR Nlin.
EGREP x GREP
"egrep" é o mesmo que "grep -E"
${NLin} ==> As CHAVES, são para proteger a VAR "$NLin", pode trocar por "$NLin"
egrep --help |egrep --color '\-\n\b'
-n, --line-number emite o número da linha na linha de saída
egrep --help |egrep --color '\-\m\b'
-m, --max-count=NÚM interrompe depois de NÚM ocorrências


Att.:
Marcelo Oliver



3. Re: Inseri texto em um arquivo [RESOLVIDO]

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 16/08/2016 - 18:20h

Não sou muito bom com regex mais essa gambiarra talvez possa te ajudar.

texto = Oque você quer colocar entre a e b

cat arquivo | paste -s | sed 's/a\tb/a\ttexto\tb/1; s/\t/\n/g' 






----------------------------------------------------------
A Internet... foi projetada no espírito da confiança. Nem os protocolos de rede
de comunicações nem o software que comanda os sistemas computacionais
conectados a rede foram arquitetados para operação num ambiente no qual estão sob
ataque.
----------------------------------------------------------


4. Re: Inseri texto em um arquivo

thinomar
thinomar

(usa Linux Mint)

Enviado em 16/08/2016 - 18:32h

echo -e "a\na\na\nb\nb\nc\nc\nc" | awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' 

Descrição do awk:
-!encontrado && /b/: Apenas para quando a variável "encontrado" estiver vazia (ou for 0) e a linha conter o caracter "b"
-{print "teste" ; encontrado=1}: Imprimir a palavra "teste" e atribui o valor "1" a variável "encontrado"
-1: Realiza a ação padrão, que no caso é imprimir todas as linhas



5. Re: Inseri texto em um arquivo

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 16/08/2016 - 18:53h

ctw6av escreveu:
cat arquivo | paste -s | sed 's/a\tb/a\ttexto\tb/1; s/\t/\n/g' 


valeu velho .. funcionou perfeitamente só que ... não entendi uma "virgula" desse sed, logo pra mim não adianta muito pois se eu precisar fazer de novo não vou saber como fazer sacou ?!?!?

thinomar escreveu:
echo -e "a\na\na\nb\nb\nc\nc\nc" | awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' 


fiz assim
awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' arquivo.txt 


funcionou quase 100% ... só faltou alterar a parada no arquivo !!! o que implemento aí para a parada alterar no arquivo ???


___________________________________________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"


6. Re: Inseri texto em um arquivo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/08/2016 - 19:42h

Mauriciodez escreveu:

pessoas .. tô apanhando para conseguir a parada aqui

preciso inserir um texto em um arquivo ( arquivo.txt )... digamos "novo texto" ... só que preciso colocar ele na linha de baixo depois da última ocorrência de uma string, ou colocar o texto uma linha acima da primeira ocorrência de outra string.

Consigo identificar as ocorrencias e tb consigo inserir um texto, a guerra está sendo para juntar os dois comandos, deem um help !!

ex:
mauricio@Phantom:~/área de trabalho$ cat arquivo.txt
a
a
a
a
a
b
b
c
c
mauricio@Phantom:~/área de trabalho$


Preciso inserir um texto ou antes do primeiro "b" ou depois do último "a"


Boa noite Mauricio, segue uma sugestão . . .
Simples, mas funciona . . . :)
PEGA a LINHA da OCORRÊNCIA:
NLin=$(egrep -n -m1 'b' ARQUIVO.txt|cut -d: -f1) 

ALTERA no ARQUIVO:
sed -i "${NLin}i\TEXTO INSERIDO" ARQUIVO.txt 


Att.:
Marcelo Oliver



7. Re: Inseri texto em um arquivo [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 17/08/2016 - 01:29h

msoliver escreveu:


marcelo ... fiz assim

NLin=$(egrep -n -m1 'b' arquivo.txt|cut -d: -f1) | sed -i "${NLin}i\TEXTO INSERIDO" arquivo.txt 


deu ruim

mauricio@Phantom:~/área de trabalho$ cat arquivo.txt
TEXTO INSERIDO
a
TEXTO INSERIDO
a
TEXTO INSERIDO
a
TEXTO INSERIDO
b
TEXTO INSERIDO
b
TEXTO INSERIDO
b
TEXTO INSERIDO
c
TEXTO INSERIDO
c
TEXTO INSERIDO
c
mauricio@Phantom:~/área de trabalho$



___________________________________________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"


8. Re: Inseri texto em um arquivo [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/08/2016 - 02:16h

Script:

#!/bin/bash

export ax1 last1 flag1

last1="$(head -1 teste.txt)";
flag1=0

while read i
do

ax1="$i"

if [ "$last1" != "$i" ]
then
[ "$flag1" == 0 ] && echo "Frase."
flag1=1
fi

echo $i
last1="$i"

done < teste.txt


Arquivo de exemplo teste.txt:

a
a
a
a
a
a
a
b
b
b
b
b
b
b
b
c
c
c
c


Resultado:

a
a
a
a
a
a
a
Frase.
b
b
b
b
b
b
b
b
c
c
c
c


Serve?

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



9. Re: Inseri texto em um arquivo [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/08/2016 - 02:56h

Tentando explicar cat arquivo | paste -s | sed 's/a\tb/a\ttexto\tb/1; s/\t/\n/g'

cat arquivo | - exibe na tela o conteúdo de arquivo

| - pipe, ou redirecionamento para outro comando

paste -s - coloca as linhas de um arquivo ou de um redirecionamento em uma única linha

| - outro redirecionamento

sed - é um editor de fluxo

's/ - faz uma busca

a\tb/ procura por um trecho no redirecionamento que conste uma string (a) separada por uma tabulação (\t) seguida de outra string (b)
ou seja, onde a string muda, ao final de uma e no começo de outra

a\ttexto\tb/ substitui pelas duas strings separadas por "texto", que representa a tal saída a ser colocada entre as duas strings

/1 apenas a primeira ocorrência no redirecionamento

; - separa comandos

s/\t/\n/g' - novo comando: faz uma procura por tabulações (\t) e as troca por caracter de quebra de linha (\n) globalmente (g)


----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



10. Re: Inseri texto em um arquivo [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/08/2016 - 03:06h

Mauriciodez escreveu:
msoliver escreveu:

marcelo ... fiz assim
NLin=$(egrep -n -m1 'b' arquivo.txt|cut -d: -f1) | sed -i "${NLin}i\TEXTO INSERIDO" arquivo.txt 

deu ruim
mauricio@Phantom:~/área de trabalho$ cat arquivo.txt
TEXTO INSERIDO
a
TEXTO INSERIDO
a
TEXTO INSERIDO
a
TEXTO INSERIDO
b
TEXTO INSERIDO
b
TEXTO INSERIDO
b
TEXTO INSERIDO
c
TEXTO INSERIDO
c
TEXTO INSERIDO
c
mauricio@Phantom:~/área de trabalho$

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

___________________________________________________________________________________________
Bom dia Mauricio . . .
Testei aqui, e continua funcionando . . .
Esse "ERRO" ocorre se a variável "NLin" estiver vazia, ou se a mesma não é "interpretada".
Qual "SHELL" vc utiliza?
Aqui no bash, vai de boa . . .

Alternativas:
TROCAR AS {} por aspas duplas:
sed -i "$"NLin"i\TEXTO INSERIDO" arquivo.txt 

TROCAR ASPAS DUPLAS POR SIMPLES:
sed -i ''$NLin'i\TEXTO INSERIDO' arquivo.txt 

OBS.: ANTES Do $NLin são duas aspas simples

Explicando os comandos:
O egrep pega o Nº da linha da 1ª ocorrência de "b", armazena em "NLin"
O sed (com essa sintaxe), INSERE UMA LINHA, antes da linha definida em NLin .

cat ARQUIVO.txt (ANTES)
a
a
a
a
a
a
b
b
b
c
c
c
cat ARQUIVO.txt (DEPOIS)
a
a
a
a
a
a
TEXTO INSERIDO
b
b
b
c
c
c


att.:
Marcelo Oliver


11. Re: Inseri texto em um arquivo [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

Enviado em 17/08/2016 - 10:29h

Mauriciodez escreveu:
thinomar escreveu:
echo -e "a\na\na\nb\nb\nc\nc\nc" | awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' 


fiz assim
awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' arquivo.txt 

funcionou quase 100% ... só faltou alterar a parada no arquivo !!! o que implemento aí para a parada alterar no arquivo ???


comandoQueLeArquivo | comandoQueProcessaArquivo > arquivoNovoOuAtual.txt 



12. Re: Inseri texto em um arquivo

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 17/08/2016 - 11:09h

Pessoas ... seguinte

Funciona no bash, mas não altera o arquivo.
cat arquivo.txt | paste -s | sed 's/a\tb/a\ttexto\tb/1; s/\t/\n/g' 


Funciona no bash, mas não altera o arquivo.
awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' arquivo.txt 


tentei assim e apagou o arquivo
awk '!encontrado && /b/ {print "teste" ; encontrado=1} 1' > arquivo.txt 


Não funciona ... meu bash é 4.3.30
NLin=$(egrep -n -m1 'b' arquivo.txt|cut -d: -f1) | sed -i "${NLin}i\TEXTO INSERIDO" arquivo.txt 



mauricio@Phantom:~/área de trabalho$ sed -i "$"NLin"i\TEXTO INSERIDO" arquivo.txt | sed -i ''$NLin'i\TEXTO INSERIDO' arquivo.txt
sed: -e expressão #1, caractere 3: Há caracteres sobrando após o comando
mauricio@Phantom:~/área de trabalho$


pessoas ... fiquei ontem até altas horas tentando fazer essa joça funcionar e só consegui uma dor nas costas

Listeiro ... não vou testar o script pq não vou usar ele ... a intenção é fazer com uma linha de comando pq essa é só uma alteração q vou ter que fazer ... pode-se que no futuro apareça mais alterações pontuais !!!


___________________________________________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts