The UNIX and Linux Forums  

Go Back   O UNIX e Linux Forum > Top Fóruns > Programação Shell Script e
.
google unix.com



Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui.

Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
Fio Thread Starter Fórum Respostas Última postagem
sed: encontrar correspondência e apagar a linha acima cstovall Programação Shell Script e 3 07-02-2008 11:31
Perl: Corresponder uma linha com vários padrões de pesquisa Juha Programação Shell Script e 10 04-09-2008 02:43
Múltiplas linha jogo usando sed SiftinDotCom Programação Shell Script e 15 03-28-2008 02:12
ler e combinar várias linhas em perl zx1106 Programação Shell Script e 5 03-14-2008 10:21
sed - substituição da linha que contém o padrão coincide com uma nova linha kousikan Programação Shell Script e 2 03-24-2007 07:24

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
Linkback Thread Tools Pesquisar este Thread Rate Thread Display Modes
  #1 (permalink)  
Old 03-27-2008
user_prady user_prady is offline
Usuário
  
 

Join Date: Sep 2007
Lugares: 163
Unhappy se igualar encontrados ir para uma determinada linha em perl

Olá Peritos,

Estou a newbie perl, Apenas curioso para saber como fazer o seguinte na perl.
Suponho que tenho um arquivo txt como abaixo. quando se funda "* Principais Iniciar"
Em seguida, vá para "* Fim principal ,,,,,,,," patteren e apenas coletar o número a partir da linha anterior do "* Fim principal ,,,,,,," padrão. No meu caso é 5. Então inicie excuting normalmente a partir da "* Principais Iniciar" posição

Na sequência é a imagem .. Eu não quero criar nenhum arquivo temporário também ..
Arquivo de entrada:

Código:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,

Saída:

Código:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,

Eu tenho para imprimir todas as linhas, pois é quando ele encontrou uma linha começando com *. Thats por isso que estou fazendo como abaixo

Código:
 if(m/^\*/){
              print "//", $_;
              next;
    }


Código:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;

Qualquer ajuda appriciated mais ..

atenciosamente,
user_prady

Última edição por user_prady; em 03-28-2008 12:51..
  #2 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Usuário
  
 

Join Date: Sep 2007
Lugares: 163
Não é possível!

Citação:
Originally Posted by user_prady View Post
Olá Peritos,

Estou a newbie perl, Apenas curioso para saber como fazer o seguinte na perl.
Suponho que tenho um arquivo txt como abaixo. quando se funda "* Principais Iniciar"
Em seguida, vá para "* Fim principal ,,,,,,,," patteren e apenas coletar o número a partir da linha anterior do "* Fim principal ,,,,,,," padrão. No meu caso é 5. Então inicie excuting normalmente a partir da "* Principais Iniciar" posição

Na sequência é a imagem .. Eu não quero criar nenhum arquivo temporário também ..
Arquivo de entrada:

Código:
*Init End
*Main Start
*Comment Reset Timers
000000,0000,0,0,0,0,0,1,0
000000,0000,0,0,0,0,1,1,0 
*Comment Control Frame at 1.04596 ms
000000,0400,0,0,0,0,1,0,1
2418A4,0000,0,1,3,0,0,0,0 
049C00,0000,0,0,2,0,0,0,0
*Comment Control Frame at 1.04673 ms
*Comment Control Frame at
000002,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000100,0000,0,0,2,0,0,0,0
*Comment Control Frame at
000004,0000,0,0,0,0,1,0,1
241002,0000,0,1,3,0,0,0,0
000000,0000,0,0,2,0,0,0,0
*Comment Frame 13 at ** us,,,,,,,,
000005,7E3D,0,0,0,0,1,0,1
*Main End,,,,,,,,

Saída:

Código:
*Init End
*Main Start
 repeat(5);
process all lines as usual here.

............
*Main End,,,,,,,,,

Eu tenho para imprimir todas as linhas, pois é quando ele encontrou uma linha começando com *. Thats por isso que estou fazendo como abaixo

Código:
 if(m/^\*/){
              print "//", $_;
              next;
    }


Código:
Basic Algorithm of my programme need :
1. If "*Main Start" pattern found go to line where Pattern matches "*Main end".
2. Get the previous line. and get the value of the first field.
3. Return to "*Main start" position again. & Print repeat(that number) : in my case it is 5 :
4. stop/next;

Qualquer ajuda appriciated mais ..

atenciosamente,
user_prady
Oi amigos existe qualquer maneira de fazê-lo. Pls help ..

Obrigado

Última edição por user_prady; em 03/30/2008 11:07..
  #3 (permalink)  
Old 03-30-2008
era era is offline Forum Advisor  
Herder do Inútil Gatos (On Sabático)
  
 

Join Date: Mar 2008
Localização: / lá / é / só / bin / sh
Posts: 3.652
Não dependem de mim, eu preciso voltar a ser o meu dia de emprego em breve.

Há várias maneiras de fazer isso, obviamente. O antiquado variante seria para lembrar a linha anterior e imprimir o que quando você ver o terminador. A realidade brutal Perl abordagem seria a mastigar fazendo barulho todo o arquivo e substituir tudo com uma string vazia excepto a linha antes da terminação. Há um no Perl FAQ sobre isso; perlfaq6 e em torno de questões relacionadas com deslocamento. (A pergunta sobre a C observações mais baixo da página tem algumas sugestões, também.)

Mas a "linha anterior" solução é absolutamente a mais simples, neste caso, se você não tem outras exigências.


Código:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'

Não tem certeza sobre o controlo de fluxo tentou descrever. Tem de se lembrar de tudo, desde suposto principal começar até final principais e imprimir que após a saída da última linha principal antes de terminar? (Acho que este já pode ser considerada uma pseudo-execução de código que for preciso. Mas, então talvez eu consideraria uma regex substituição ao longo de todo o arquivo, ou de cada * Principais Iniciar secção, depois de tudo.)

Última edição por época; em 03/30/2008 07:22.. Motivo: Adicionar um snippet Perl para lembrar linha anterior
  #4 (permalink)  
Old 03-30-2008
user_prady user_prady is offline
Usuário
  
 

Join Date: Sep 2007
Lugares: 163
Citação:
Originally Posted by era View Post
Não dependem de mim, eu preciso voltar a ser o meu dia de emprego em breve.

Há várias maneiras de fazer isso, obviamente. O antiquado variante seria para lembrar a linha anterior e imprimir o que quando você ver o terminador. A realidade brutal Perl abordagem seria a mastigar fazendo barulho todo o arquivo e substituir tudo com uma string vazia excepto a linha antes da terminação. Há um no Perl FAQ sobre isso; perlfaq6 e em torno de questões relacionadas com deslocamento. (A pergunta sobre a C observações mais baixo da página tem algumas sugestões, também.)

Mas a "linha anterior" solução é absolutamente a mais simples, neste caso, se você não tem outras exigências.


Código:
perl -ne 'BEGIN { $matching = 0; }
  $matching = 1 if (m/^\*Main Start/);
  next unless $matching;
  print $prev if (defined $prev && m/^\*Main End/);
  $prev = $_'

Não tem certeza sobre o controlo de fluxo tentou descrever. Tem de se lembrar de tudo, desde suposto principal começar até final principais e imprimir que após a saída da última linha principal antes de terminar? (Acho que este já pode ser considerada uma pseudo-execução de código que for preciso. Mas, então talvez eu consideraria uma regex substituição ao longo de todo o arquivo, ou de cada * Principais Iniciar secção, depois de tudo.)
Graças Era um lote para a sua gentileza .. I ll tentar sua maneira mencionado ..
  #5 (permalink)  
Old 03-30-2008
era era is offline Forum Advisor  
Herder do Inútil Gatos (On Sabático)
  
 

Join Date: Mar 2008
Localização: / lá / é / só / bin / sh
Posts: 3.652
Acho que não tenham sido capturados corretamente todos os seus requisitos, mas pelo menos é um começo. Se estou autorizado a adivinhar, o que seria mais fácil é recolher a saída em uma variável e imprimi-la depois de ter visto * Fim principal e impressas fora da linha, que imediatamente precedeu.
  #6 (permalink)  
Old 03-31-2008
user_prady user_prady is offline
Usuário
  
 

Join Date: Sep 2007
Lugares: 163
como fazê-lo em perl

Citação:
Originally Posted by era View Post
Acho que não tenham sido capturados corretamente todos os seus requisitos, mas pelo menos é um começo. Se estou autorizado a adivinhar, o que seria mais fácil é recolher a saída em uma variável e imprimi-la depois de ter visto * Fim principal e impressas fora da linha, que imediatamente precedeu.
Tentei quase todos maneira utilizando próximo, refazer e último comando em perl , Mas eu não posso obter estas sintaxe corretamente no perl. Sei que a sua fácil, mas eu ainda cant encontrar a forma eficiente e utilizando ao mesmo tempo próxima declaração em perl.

Estou tentando fazer a follwoing em perl


Código:
nawk ' {
        if($0 ~ /^\*Main Start/){
	     while( $0 !~ /^\*Main End/){
	     print $0;
             getline;
        }
     }
 } ' my.txt

Um código mais quero fazê-lo em perl pls me dar alguma idéia básica como fazê-lo sem criar ficheiros temporários ..


Código:
TMP=/tmp/my_tmp$$
nawk '
/\*Main End/{
split(x,arr,",")
print "Loop  " arr[1]
};
{x=$0
}
' my.txt > $TMP 

nawk '{
if($0 ~ /^Loop/){
    loop = $2 
    next;
  }
if($0 ~ /^\*Main Start/){
     printf "\nrepeat ("
     print  loop

} ' $TMP $my.txt


Thanks & Regards,
user_prady

Última edição por user_prady; em 03/31/2008 02:48..
Closed Thread

Marcadores

Tags
perl, perl regex, perl turnos, regex, deslocar, turnos perl, solaris

Thread Tools Pesquisar este Thread
Pesquisar este Thread:

Pesquisa Avançada
Display Modes Esta taxa Thread
Esta taxa Thread:

Destacamento Regimento
Você não pode postar novas threads
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar suas postagens

BB code é Ligado
Smilies são Ligado
[IMG] código é Ligado
Código HTML é Desligado
Trackbacks são Ligado
Pingbacks são Ligado
Refbacks são Ligado




Todos os horários são GMT -4. A hora é agora 02:53.


Powered by: vBulletinCopyright © 2000 - 2006, Jelsoft Enterprises Limited. Língua Traduções Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
O UNIX e Linux Fóruns Content Copyright © 1993-2009. Todos os Direitos Reserved.Ad Gestão por RedTyger

Content Relevant URLs por vBSEO 3.2.0