Duvidas com o comando sed, echo e printf [RESOLVIDO]

1. Duvidas com o comando sed, echo e printf [RESOLVIDO]

Marco Capella
MarcoC

(usa Outra)

Enviado em 09/09/2020 - 15:21h

Ola.

Pessoal estou tentando editar o arquivo 'profile' do debian com um script no editor Geany incluindo e excluido o comando '/.appjogos/script.sh', seguindo o topico

https://www.vivaolinux.com.br/topico/Shell-Script/COMO-APAGAR-UMA-PALAVRA-DE-UM-ARQUIVO, esperimentei usando

' sed -i "s/uma linha de comando qualquer//g" /home/pi/Desktop/profile ' que funcionou perfeitamente, mas ao incluir a linha realmente necessaria que e

' sed -i "s//.appjogos/script.sh//g" /home/pi/Desktop/profile

recebo a mensagem de erro ' sed: -e expressão #1, caractere 14: opção desconhecida para o comando `s' (s///?) ' , voces poderiam me ajudar ?

Ao incluir a linha ' /.appjogos/script.sh ' usei o comando ' echo ' , a principio funcionou legal mas notei que cada vez que incluia a linha o comando colocava uma linha em branco antes, substitui pelo

comando ' printf ' e o problema da linha antes foi resolvido mas a linha em branco como ultima linha (que acho que deve existir) foi apagado, alguma sugestão ?

Pessoal, muito obrigado pela atenção e por qualquer ajuda ok ?

Abaixo o script, sei que ele esta muito comentado mas como não tenho muito conhecimento achei mais facil para não me perder.

#!/bin/bash
# script de exemplo para a procura de uma palavra ou linha dentro do arquivo
#
if grep "/.appjogos/script.sh" /home/pi/Desktop/profile > /dev/null
# if grep $word $file > /dev/null
then
# a palavra/linha "/.appjogos/script.sh" EXISTE e sera excluida
sed -i "s//.appjogos/script.sh//g" /home/pi/Desktop/profile
# sed 's//.appjogos/script.sh' /home/pi/Desktop/profile
sleep 0.5
else
# a palavra/linha "/.appjogos/script.sh" NAO existe e sera incluida na ultima linha
printf "/.ppjogos/script.sh" >> /home/pi/Desktop/profile
sleep 0.5
fi
exit





  


2. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

Marco Capella
MarcoC

(usa Outra)

Enviado em 09/09/2020 - 15:47h

Pessoal estive pensando, sera que funciona incluir uma linha prontf sem ficar acrescentando uma linha a mais?

Antes

# a palavra/linha "/.appjogos/script.sh" NAO existe e sera incluida na ultima linha
printf "/.ppjogos/script.sh" >> /home/pi/Desktop/profile
sleep 0.5
fi
exit

Depois

# a palavra/linha "/.appjogos/script.sh" NAO existe e sera incluida na ultima linha
printf "/.ppjogos/script.sh" >> /home/pi/Desktop/profile
printf " " >> /home/pi/Desktop/profile
sleep 0.5
fi
exit

Obrigado pela atenção.


3. Re: Duvidas com o comando sed, echo e printf

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 09/09/2020 - 15:59h

Come que eu vou saber o que é para modificar se você não diz que linha qualquer é essa e nem o conteúdo.
E nem coloco o conteúdo do arquivo a editar?
Erro falha na bola de cristal.

A ta terminando de ler o script eu entende.
Pera que jaja eu termino.

Testa ai eu não testei.
#!/usr/bin/env bash

# script de exemplo para a procura de uma palavra ou linha dentro do arquivo
while true # Laço de repetição.
do
if cat /home/pi/Desktop/profile | grep "/.appjogos/script.sh" >/dev/null
then
sed -i '/\/.appjogos\/script.sh/d' /home/pi/Desktop/profile && sleep 0.5; break || exit 8 # a palavra/linha "/.appjogos/script.sh" EXISTE e sera excluída
else
echo '/.ppjogos/script.sh' >> /home/pi/Desktop/profile && sleep 0.5 || exit 10 # a palavra/linha "/.appjogos/script.sh" NÃO existe e sera incluída na ultima linha
fi
done

O while é um loop para ficar repetindo ate que a condição seja satisfeita.
No sed você não colocou o escape "\" para escapar o próximo caractere.
O exit é para salvar na variável especial a linha onde ocorreu o erro na execução do script que na primeira o erro seria na linha 8 e o segundo na linha 10.
O break quebra o loop.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


4. Re: Duvidas com o comando sed, echo e printf

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/09/2020 - 16:59h

A sintaxe do comando:
sed -i "s//.appjogos/script.sh//g" /home/pi/Desktop/profile
Está errada!!!!
Formas corretas:
sed -i 's/trocaisto/por_isso/' arquivo
ou
sed -i '/nalinhaquetemisto/s/troca_isto/por_isso/' arquivo
Ou ainda
sed '5s/.*/novo_texto/' arquivo #Na linha 5 troca tudo, por novo_texto
Comandos básicos de substituição de "texto"

Exemplos:
Gerando o arquivo para testes...
seq 0 12|xargs -i printf "Linha_%02d\n" {} > linhas.txt
Coloca "Par|Impar" no final da linha
sed '/[13579]$/s/$/ Impar/;s/[0-9]$/& Par/' linhas.txt
Deleta as linhas que terminam com [579]:
sed '/[579]$/d' linhas.txt
*********************************************************************************************************
comando ' printf ' e o problema da linha antes foi resolvido mas a linha em branco como ultima linha (que acho que deve existir) foi apagado, alguma sugestão ?
Sim,
printf "Texto a ser escrito no arquivo\n" >> arquivo
"Só colocar o \n"

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


5. Re: Duvidas com o comando sed, echo e printf

Marco Capella
MarcoC

(usa Outra)

Enviado em 09/09/2020 - 19:29h

Muito obrigado a todos, acho que tudo esta resolvido.

Esse pequeno script faz parte de outro com mais de 1000 linhas ate agora, esse script devera ser iniciado automaticamente

apos o login do usuario num debian cli, oferecendo um menu com a relação de acessorios, jogos, aplicativos, etc (mais de 300 ate o momento), todos

de terminal e com nome, descrição e tambem possibilidade de retirar o

carregamento automatico do script.

Abaixo o script de teste e o resultado destes testes ok?

O Script

#!/bin/bash
#
# script de exemplo para a procura de uma palavra ou linha dentro do arquivo
#
if grep "/.appjogos/facilitymenu" /home/pi/Desktop/profile > /dev/null
then
echo " a linha "/.appjogos/facilitymenu" EXISTE e sera excluida"
sed -i '/\/.appjogos\/facilitymenu/d' /home/pi/Desktop/profile
sleep 5
else
echo " a linha "/.appjogos/facilitymenu" NAO existe e sera incluida na ultima linha"
echo '/.appjogos/facilitymenu' >> /home/pi/Desktop/profile
sleep 5
fi
exit


Arquivo profile antes e depois do uso do script

ANTES

http://www.redelegal.com/imagens/profile_antes.png

DEPOIS

http://www.redelegal.com/imagens/profile_depois.png

Muito obrigado a todos,




6. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 09/09/2020 - 19:57h

Então cara eu ainda te mostrei como verificar se deu erro na execução do script.
Você esta fazendo para você mesmo ou é para alguém se é para alguém arruma isso ai.
Parece que seu script é de alguém que acabo de assistir shell script no youtube e esta tentando pela primeira vez a programar.
Assim horroroso ele não esta mais ele devia ter as saída de erro o que faz ele simples (noob).
Vamos supor que por algum motivo o dono do arquivo profile tenha decidido retirar a permissão de modificação o script vai dar erro e vai continuar a execução.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


7. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

Marco Capella
MarcoC

(usa Outra)

Enviado em 09/09/2020 - 23:28h

aguamole muito obrigado pela sua atenção.

Pretendo inserir esse script maior num debian puro, apenas linha de comando compilado especialmente para Raspberry Pi 2,3 e 4 e apenas para estudo e treinamento ok?

Sou das antigas sabe, vou reproduzir um texto antigo do forum da comunidade Debian pois acho que vc vai entender melhor.

Apesar do pouco (atualmente nenhum) conhecimento que tenho ( sou do tempo do micro TK85 ou TK90X
https://pt.wikipedia.org/wiki/TK_85 , PC-dos ou posterior MS-DOS https://pt.wikipedia.org/wiki/DOS e linguagem de programação
Basic puro https://pt.wikipedia.org/wiki/BASIC, faz um tempão ne ? rs rs rs )


Sou do tempo em que o monitor era de fosforo verde e tinha apenas 80 colunas e 24 linhas, a maior evolução de monitores foi quando

lançaram com fosforo branco (rs rs rs ), para colocar a letra "A"no centro da tela em basic puro o comando era (acho) print at 40,12 "A" .

Ao me aposentar, alem de diminuir a remuneração mensal ganhei de brinde o tedio, ao descobrir o Raspberry Pi me apaixonei pelo Linux (Debian ) e resolvi começar a estudar o shell-script do linux.

Muito obrigado pela sua atenção e paciência.

Saudações a todos.




8. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 10/09/2020 - 00:00h

Então é muito tempo sabia que eu nem tinha nascido?
Então hoje é mais fácil para aprender as coisas as antigas tinha que comprar livros agora pode comprar livro também mais a internet é uma biblioteca móvel que cabe no seu bolso.
Shell script eu aprende fazendo curso no youtube.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


9. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 10/09/2020 - 00:23h

Faz assim o:
#!/usr/bin/env bash
#
# Script de exemplo para a procura de uma palavra ou linha dentro do arquivo
#
if grep "/.appjogos/facilitymenu" /home/pi/Desktop/profile > /dev/null
then
echo 'A linha "/.appjogos/facilitymenu" EXISTE e sera excluída'; sed -i '/\/.appjogos\/facilitymenu/d' /home/pi/Desktop/profile && sleep 5 || echo -e "\033[01;31mFalha\033[m" && exit 1
else
echo 'A linha "/.appjogos/facilitymenu" NÃO existe e sera incluída na ultima linha'; echo '/.appjogos/facilitymenu' >>/home/pi/Desktop/profile; sleep 5 || echo -e "\033[01;31mFalha\033[m" && exit 1
fi


Você não esta usando acentuação o bash aceita acentuação.
Você não esta usando letra maiúscula no inicio das frases o bash é case sensitive então ele entende letra maiúscula é diferente de letra minuscula.

Caso esteja achando os comando grande de mais você pode usar o escape "\" para que o bash entenda que a quebra de linha é para ser interpretada como caractere fica assim?
#!/usr/bin/env bash
#
# Script de exemplo para a procura de uma palavra ou linha dentro do arquivo
#
if grep "/.appjogos/facilitymenu" /home/pi/Desktop/profile > /dev/null
then
echo 'A linha "/.appjogos/facilitymenu" EXISTE e sera excluída'
sed -i '/\/.appjogos\/facilitymenu/d' /home/pi/Desktop/profile && \
sleep 5 || \
echo -e "\033[01;31mFalha\033[m" && \
exit 1
else
echo 'A linha "/.appjogos/facilitymenu" NÃO existe e sera incluída na ultima linha'
echo '/.appjogos/facilitymenu' >>/home/pi/Desktop/profile && \
sleep 5 || \
echo -e "\033[01;31mFalha\033[m" && \
exit 1
fi

Em shell diferente das outras linguagem o 0 significa sucesso e qualquer numero diferente de 0 significa falha então por isso usei o 1 no exit.
A variável especial em que fica armazenado a saída do exit é $? ela permanece ate a execução do próximo comando que pode ou não alterar o conteúdo dela.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.


10. Re: Duvidas com o comando sed, echo e printf [RESOLVIDO]

João Cláudio de Alcântara
aguamole

(usa Lubuntu)

Enviado em 10/09/2020 - 00:59h

MarcoC escreveu:

Muito obrigado a todos, acho que tudo esta resolvido.

Esse pequeno script faz parte de outro com mais de 1000 linhas ate agora, esse script devera ser iniciado automaticamente

apos o login do usuario num debian cli, oferecendo um menu com a relação de acessorios, jogos, aplicativos, etc (mais de 300 ate o momento), todos

de terminal e com nome, descrição e tambem possibilidade de retirar o

carregamento automatico do script.

Abaixo o script de teste e o resultado destes testes ok?

O Script

#!/bin/bash
#
# script de exemplo para a procura de uma palavra ou linha dentro do arquivo
#
if grep "/.appjogos/facilitymenu" /home/pi/Desktop/profile > /dev/null
then
echo " a linha "/.appjogos/facilitymenu" EXISTE e sera excluida"
sed -i '/\/.appjogos\/facilitymenu/d' /home/pi/Desktop/profile
sleep 5
else
echo " a linha "/.appjogos/facilitymenu" NAO existe e sera incluida na ultima linha"
echo '/.appjogos/facilitymenu' >> /home/pi/Desktop/profile
sleep 5
fi
exit


Arquivo profile antes e depois do uso do script

ANTES

http://www.redelegal.com/imagens/profile_antes.png

DEPOIS

http://www.redelegal.com/imagens/profile_depois.png

Muito obrigado a todos,



Esta errado o correto é:
echo ' a linha "/.appjogos/facilitymenu" EXISTE e sera excluida'
Ou
echo " a linha \"/.appjogos/facilitymenu\" EXISTE e sera excluida"

O outro echo também esta errado.

CPU i5-8400 GTX 750 SofRaid 4xSSD 16GB DDR4 mesmo assim uso Lubuntu.






Patrocínio

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

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts