![]() |
Olá e boas-vindas de Estados Unidos para o UNIX e Linux Forum! Obrigado por visitar e fazer parte da nossa comunidade global.
|
|
google unix.com
|
|||||||
| Fóruns | Registar | Fórum Regimento | Ligações | Álbuns | FAQ | Lista deputados | Calendário | Pesquisa | Today's Posts | Mark Forums Read |
| 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 |
| Como chegar a linhas iniciadas com correspondência strings usando sed ou grep para loop? | LARANJA | Programação Shell Script e | 8 | 07-13-2009 05:26 |
| Grep e apagar linhas exceto as linhas com cordas | vj8436 | Programação Shell Script e | 14 | 04-17-2009 11:25 |
| Para grep 10 linhas após uma string em um arquivo txt. | suman82 | Programação Shell Script e | 6 | 12-13-2008 01:08 |
| grep string & algumas linhas depois | ashterix | Programação Shell Script e | 7 | 12-07-2008 09:20 |
| grep string & próxima n linhas | ashterix | Programação Shell Script e | 8 | 11-21-2005 11:38 |
![]() |
|
|
Linkback | Thread Tools | Pesquisar este Thread | Rate Thread | Display Modes |
|
|
|
||||
|
grep uma corda nas linhas entre 2 strings de um arquivo
Oi,
Por favor, ajudem-me com o seguinte problema: Eu tenho um arquivo xml com as seguintes linhas Código:
<cisco:name>
<cisco:mdNm>Cisco Device 7500 A Series</cisco:mdNm>
<cisco:meNm>10.1.100.19</cisco:meNm>
<cisco:ehNm>/shelf=1</cisco:ehNm>
<cisco:subname>
<cisco:sptp>Cisco PortA Series</cisco:sptp>
<cisco:aliasNameList xsi:nil="true"/>
<cisco:owner xsi:nil="true"/>
<cisco:subportname>
<cisco:cpt>Cisco SubPort B Series</cisco:cpt>
<cisco:aliasNamesubList xsi:nil="true"/>
<cisco:userLabel xsi:nil="true"/>
</cisco:subportname>
</cisco:subname>
<cisco:subname>
<cisco:sptp>Cisco PortAB Series</cisco:sptp>
<cisco:aliasNameList xsi:nil="true"/>
<cisco:owner xsi:nil="true"/>
<cisco:subportname>
<cisco:cpt>Cisco SubPort AB Series</cisco:cpt>
<cisco:aliasNamesubList xsi:nil="true"/>
<cisco:userLabel xsi:nil="true"/>
</cisco:subportname>
</cisco:subname>
</cisco:name>
<cisco:name>
<cisco:mdNm>Cisco Device 7500B Series</cisco:mdNm>
<cisco:meNm>10.1.100.20</cisco:meNm>
<cisco:ehNm>/shelf=2</cisco:ehNm>
<cisco:subname>
<cisco:sptp>Cisco Port B Series</cisco:sptp>
<cisco:aliasNameList xsi:nil="true"/>
<cisco:owner xsi:nil="true"/>
<cisco:subportname>
<cisco:cpt>Cisco SubPort B Series</cisco:cpt>
<cisco:aliasNamesubList xsi:nil="true"/>
<cisco:userLabel xsi:nil="true"/>
</cisco:subportname>
</cisco:subname>
</cisco:name>
Código:
#!/bin/sh
sed '/<\/cisco:name>/{G;}' test.xml >temp
nawk 'BEGIN{RS=""}
{
grep -c '<cisco:cpt>' print
}' temp
rm temp
em primeiro <cisco:name> e </ cisco: nome> loop deve dar 2 então para o próximo seria 1 plz help |
|
||||
|
Citação:
$ 0 ~ / (um | dois | três) / |
|
||||
|
mais formalmente, perl pode lidar com muitos documento XML disponíveis módulo.
Você pode tentar para ver o resultado Código:
use XML::Parser;
my $file = 'a.xml';
my ($flag,$index,@arr,%hash)=(0,-1);
sub start_handler
{
my $expat = shift;
my $element = shift;
if($element eq 'cisco:name'){
$index++;
}
else{
if($element eq 'cisco:cpt'){
$flag=1
}
else{
$flag=0;
}
}
}
sub char_handler
{
my ($p, $data) = @_;
if( ($flag eq '1') and !($data =~ /^\s*$/)){
$arr[$index]++;
$hash{$index}.=" ".$data;
}
}
my $parser = new XML::Parser(ErrorContext => 2);
$parser->setHandlers(Start => \&start_handler,
Char => \&char_handler);
$parser->parsefile($file);
for(my $i=0;$i<=$#arr;$i++){
print $arr[$i],"\n";
print $hash{$i},"\n";
print "--------\n";
}
|
|
||||
|
Eu fiz o mesmo
Código:
awk '{ if ( $0 ~ /<cisco:cpt> | <cisco:sptp>/ ) {i++} if ( $0 ~ /<\/cisco:name>/ ) {print "cpt=" i;i=0}}' test.xml
como cpt \u003d 1 sptp \u003d 2 |
![]() |
| Marcadores |
| Thread Tools | Pesquisar este Thread |
| Display Modes | Esta taxa Thread |
|
|