Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

1. Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Morpheus
Minions

(usa Nenhuma)

Enviado em 19/04/2023 - 00:16h

Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

usuario="goku"

# Adicionar

sed -i 's/# '$usuario' ALL=(ALL) ALL/'$usuario' ALL=(ALL) ALL/' "$arquivo"



# Remove (rodei duas vezes essa mesma opção)

sed -i 's/'$usuario' ALL=(ALL) ALL/# '$usuario' ALL=(ALL) ALL/' "$arquivo"


  


2. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/04/2023 - 22:56h


Minions escreveu:

Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

usuario="goku"

# Adicionar

sed -i 's/# '$usuario' ALL=(ALL) ALL/'$usuario' ALL=(ALL) ALL/' "$arquivo"
# Remove (rodei duas vezes essa mesma opção)

sed -i 's/'$usuario' ALL=(ALL) ALL/# '$usuario' ALL=(ALL) ALL/' "$arquivo"

Minios, quantas linhas com esse usuário "goku"?
Qual linha quer alterar?


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



3. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Morpheus
Minions

(usa Nenhuma)

Enviado em 22/04/2023 - 11:23h


msoliver escreveu:

quantas linhas com esse usuário "goku"?
Qual linha quer alterar?



Pode altera todas as linha ou somente uma linha com o sed?

primeira rodada
# goku ALL=(ALL) ALL

Conforme roda vai colocando um #

## goku ALL=(ALL) ALL
### goku ALL=(ALL) ALL
#### goku ALL=(ALL) ALL
##### goku ALL=(ALL) ALL
###### goku ALL=(ALL) ALL
####### goku ALL=(ALL) ALL
######## goku ALL=(ALL) ALL
######### goku ALL=(ALL) ALL

...

O correto seria remove ou adicionar um # somente conforme a escolha do usuário.



4. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 23/04/2023 - 23:37h


Minions escreveu:


msoliver escreveu:

quantas linhas com esse usuário "goku"?
Qual linha quer alterar?



Pode altera todas as linha ou somente uma linha com o sed?

primeira rodada
# goku ALL=(ALL) ALL

Conforme roda vai colocando um #

## goku ALL=(ALL) ALL
### goku ALL=(ALL) ALL
#### goku ALL=(ALL) ALL
##### goku ALL=(ALL) ALL
###### goku ALL=(ALL) ALL
####### goku ALL=(ALL) ALL
######## goku ALL=(ALL) ALL
######### goku ALL=(ALL) ALL

...

O correto seria remove ou adicionar um # somente conforme a escolha do usuário.

Perfeitamente!!!!
Desde que, o script esteja CORRETO!!!!!

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh
ERRO
#-------------------------------#
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh rem
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#--------------------------------#
#script
#!/usr/bin/env bash
arq="arq.txt";
case $1 in
add) sed -i "/^$USER.*ALL/s/^/#/" ${arq};;
rem) sed -i "/^#.*$USER.*ALL/s/#//" ${arq};;
*) echo "ERRO";;
esac
#Outra opção: #Se tem comentário REMOVE, se não tem, ADICIONA##

cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
./add_rem_coment.sh

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL

./add_rem_coment.sh
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#Script#

#!/usr/bin/env bash
arq="arq.txt";

grep -Eq "^#${USER}\s+ALL.*ALL" ${arq} && sed -i "/^#.*$USER.*ALL/s/#//" ${arq} || sed -i "/^$USER.*ALL/s/^/#/" ${arq}

É isso....


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



5. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Morpheus
Minions

(usa Nenhuma)

Enviado em 24/04/2023 - 12:16h

msoliver escreveu:


Minions escreveu:


msoliver escreveu:

quantas linhas com esse usuário "goku"?
Qual linha quer alterar?



Pode altera todas as linha ou somente uma linha com o sed?

primeira rodada
# goku ALL=(ALL) ALL

Conforme roda vai colocando um #

## goku ALL=(ALL) ALL
### goku ALL=(ALL) ALL
#### goku ALL=(ALL) ALL
##### goku ALL=(ALL) ALL
###### goku ALL=(ALL) ALL
####### goku ALL=(ALL) ALL
######## goku ALL=(ALL) ALL
######### goku ALL=(ALL) ALL

...

O correto seria remove ou adicionar um # somente conforme a escolha do usuário.

Perfeitamente!!!!
Desde que, o script esteja CORRETO!!!!!

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh
ERRO
#-------------------------------#
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh rem
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#--------------------------------#
#script
#!/usr/bin/env bash
arq="arq.txt";
case $1 in
add) sed -i "/^$USER.*ALL/s/^/#/" ${arq};;
rem) sed -i "/^#.*$USER.*ALL/s/#//" ${arq};;
*) echo "ERRO";;
esac
#Outra opção: #Se tem comentário REMOVE, se não tem, ADICIONA##

cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
./add_rem_coment.sh

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL

./add_rem_coment.sh
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#Script#

#!/usr/bin/env bash
arq="arq.txt";

grep -Eq "^#${USER}\s+ALL.*ALL" ${arq} && sed -i "/^#.*$USER.*ALL/s/#//" ${arq} || sed -i "/^$USER.*ALL/s/^/#/" ${arq}

É isso....




Identifica os 2 padrões de ALL usando o * e também o nome do usuário

$USER ALL=(ALL:ALL) ALL

$USER ALL=(ALL) ALL


Agora se o usuário editar manualmente o arquivo e colocar vários espaços antes do nome.

Vai quebra o método 1 e método 2

Ex:

espaço espaço espaço espaço espaço espaço root ALL=(ALL:ALL) ALL
espaço espaço espaço espaço adminq ALL=(ALL:ALL) ALL





6. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 24/04/2023 - 14:43h


Minions escreveu:

msoliver escreveu:


Minions escreveu:


msoliver escreveu:

quantas linhas com esse usuário "goku"?
Qual linha quer alterar?



Pode altera todas as linha ou somente uma linha com o sed?

primeira rodada
# goku ALL=(ALL) ALL

Conforme roda vai colocando um #

## goku ALL=(ALL) ALL
### goku ALL=(ALL) ALL
#### goku ALL=(ALL) ALL
##### goku ALL=(ALL) ALL
###### goku ALL=(ALL) ALL
####### goku ALL=(ALL) ALL
######## goku ALL=(ALL) ALL
######### goku ALL=(ALL) ALL

...

O correto seria remove ou adicionar um # somente conforme a escolha do usuário.

Perfeitamente!!!!
Desde que, o script esteja CORRETO!!!!!

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh
ERRO
#-------------------------------#
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
./add_rem_coment.sh add
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#-------------------------------#
./add_rem_coment.sh rem
#-------------------------------#
cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL
#--------------------------------#
#script
#!/usr/bin/env bash
arq="arq.txt";
case $1 in
add) sed -i "/^$USER.*ALL/s/^/#/" ${arq};;
rem) sed -i "/^#.*$USER.*ALL/s/#//" ${arq};;
*) echo "ERRO";;
esac
#Outra opção: #Se tem comentário REMOVE, se não tem, ADICIONA##

cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
./add_rem_coment.sh

cat arq.txt
root ALL=(ALL:ALL) ALL
adminq ALL=(ALL:ALL) ALL

./add_rem_coment.sh
cat arq.txt
root ALL=(ALL:ALL) ALL
#adminq ALL=(ALL:ALL) ALL
#Script#

#!/usr/bin/env bash
arq="arq.txt";

grep -Eq "^#${USER}\s+ALL.*ALL" ${arq} && sed -i "/^#.*$USER.*ALL/s/#//" ${arq} || sed -i "/^$USER.*ALL/s/^/#/" ${arq}

É isso....




Identifica os 2 padrões de ALL usando o * e também o nome do usuário

$USER ALL=(ALL:ALL) ALL

$USER ALL=(ALL) ALL


Agora se o usuário editar manualmente o arquivo e colocar vários espaços antes do nome.
Vai quebra o método 1 e método 2

Ex:

espaço espaço espaço espaço espaço espaço root ALL=(ALL:ALL) ALL
espaço espaço espaço espaço adminq ALL=(ALL:ALL) ALL

Uma forma de contornar a situação:
Agora se o usuário editar manualmente o arquivo e colocar vários espaços antes do nome. Vai quebrar o método 1 e método 2
1 - É alterar a regex.
grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT 

2 - Se o usuário persistir em fazer $(rev <<< "ADREM"),
tire ele do sudo....

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



7. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Morpheus
Minions

(usa Nenhuma)

Enviado em 24/04/2023 - 17:00h


msoliver escreveu:

Ex:

espaço espaço espaço espaço espaço espaço root ALL=(ALL:ALL) ALL
espaço espaço espaço espaço adminq ALL=(ALL:ALL) ALL

Uma forma de contornar a situação:
Agora se o usuário editar manualmente o arquivo e colocar vários espaços antes do nome. Vai quebrar o método 1 e método 2
1 - É alterar a regex.
grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT 






Será espaço ou tabulação?

$ grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT
SEM_CMT

Mostra o aviso de SEM_CMT mas os espaços ainda fica não tem alteração no arquivo arq.txt




8. Re: Como fazer o sed não comentar várias vezes a mesma opção em um arquivo?

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 24/04/2023 - 21:21h


Minions escreveu:


msoliver escreveu:

Ex:

espaço espaço espaço espaço espaço espaço root ALL=(ALL:ALL) ALL
espaço espaço espaço espaço adminq ALL=(ALL:ALL) ALL

Uma forma de contornar a situação:
Agora se o usuário editar manualmente o arquivo e colocar vários espaços antes do nome. Vai quebrar o método 1 e método 2
1 - É alterar a regex.
grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT 






Será espaço ou tabulação?

$ grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT
SEM_CMT

Mostra o aviso de SEM_CMT mas os espaços ainda fica não tem alteração no arquivo arq.txt

Será espaço ou tabulação?
Casa espaço e/ou tabulação, em qualquer quantidade "#\s{0,}"

Mostra o aviso de SEM_CMT mas os espaços ainda fica não tem alteração no arquivo arq.txt
O comando:
grep -Eq "#\s{0,}${USER}\s+ALL.*ALL" arq.txt && echo COM_CMT || echo SEM_CMT
NÃO Altera, só mostra a mensagem.
#---------------------------------------------------------------------------------------------------------------#
poste a saída de:
cat -A arq.txt

e,
grep --color -E "($USER)\s{1,}(ALL[=):( ]{0,}){3,4}$" arq.txt
OBS.: NEGRITE o que saiu colorido.
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts