shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] [ Sed ] - Append


From: Gustavo Filgueiras
Subject: Re: [shell-script] [ Sed ] - Append
Date: Sat, 8 Nov 2014 17:12:45 -0200

Caros,

   Muito obrigado a todos, fiquei com a solução do Itamar, mas guardei os conceitos enviado :D



Em 8 de novembro de 2014 13:51, 'Julio C. Neves' address@hidden [shell-script] <address@hidden> escreveu:
 

O sed é fácil fazer o problema é explicar. Assim sendo, peguei um exemplo da 10ª Edição do meu livro que sai em Janeiro que é muito parecido e é só adaptar. No caso, enquanto as linhas são idênticas (como seus aliases) ele não imprime. Veja:
=================================================

Olha essa linha de comando para imprimir somente uma, de duas ou mais linhas consecutivas e iguais:

$ sed '$!N; /^\(.*\)\n\1$/!P; D' ARQUIVO

Para entender vamos dividi-lo:

$!N Se for a última linha, não adicione ao Pattern Space;

/^\(.*\)\n\1$/ Aqui vamos dividir a explicação novamente:

^\(.*\)\n – Forma um grupo com o que está desde o início (^) até o \n (que separa as duas linhas no Pattern Space);

\1$ - O retrovisor que guardou o texto casado no grupo;

Desta forma, a Expressão Regular como um todo procurou no Pattern Space um texto, um \n e o mesmo texto, isto é, um texto repetido;

!P Neste caso, não imprima;

D Delete a primeira linha!

Vamos vê-lo atuando:

$ sed '$!N; /^\(.*\)\n\1$/!P; D' <<< '11111

> 22222

> 22222

> 33333

> 33333

> 33333'

11111

22222

33333

Que, para facilitar a legibilidade, também poderia ter sido escrito colocando cada um dos três comandos em uma linha e usando a opção -r (para Expressões Regulares estendidas como os parênteses) para evitar as contrabarras, ficando da seguinte forma:

$ sed -r '{

> $!N

> /^(.*)\n\1$/!P

> D

> }' <<< '11111

> 22222

> 22222

> 33333

> 33333

> 33333'

===============================================

A deia não era fazer propaganda do meu livro até pq sempre publico na minha página o ChangeLog de cada edição. Mas se alguém quiser comprá-lo, recomendo o site da editora (www.brasport.com.br), pedindo 30% de desconto e dizendo que eu mandei pedir esse desconto.

Abcs,
Julio
@juliobash
Próximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 10 a 14/11
São Paulo 4Linux 24 a 28/11
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 7 de novembro de 2014 20:53, Rodrigo Tenorio address@hidden [shell-script] <address@hidden> escreveu:
 

Boa noite.

Camarada, seu sed está executando para todas as linhas porque o filtro de expressão regular que você está insuficiente para pegar somente a linha que você precisa.
Não testei, apenas li seu sed e percebi isso.
No filtro de E.R. tente algo assim:

^alias abc=

Acredito que vá solucionar seu caso...

Rodrigo Boëchat


Em 7 de novembro de 2014 19:42, Gustavo Filgueiras address@hidden [shell-script] <address@hidden> escreveu:
 

Caros,

   Estou com um pequeno problema no sed, eu até estou conseguindo adicionar uma linha no final daonde eu preciso, mas o problema é que ele faz isso para todas as entradas, e não apenas a última. Estou usando o seguinte comando:

sed '/alias/a linha depois' /root/.bashrc
Abaixo está o arquivo original:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi



Após executar o comando fica assim:
# .bashrc

# User specific aliases and functions
linha depois

alias rm='rm -i'
linha depois
alias cp='cp -i'
linha depois
alias mv='mv -i'
linha depois
alias abc='xe vm-shutdown --force uuid="$1"'
linha depois

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi


Quando eu gostaria que fosse assim, inserindo somente na última entrada:
# .bashrc

# User specific aliases and functions
linha depois

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias abc='xe vm-shutdown --force uuid="$1"'
linha depois

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi





reply via email to

[Prev in Thread] Current Thread [Next in Thread]