Analisar e remover partes de cadeias entre delimitadores

0

Eu gostaria de passar por um arquivo e remover certas seqüências entre os delimitadores.

Por exemplo

 drw---- 00000000 11111111        0 ./a/
 drw---- 00000000 11111111        0 ./b/
 d------ 00000000 11111111        0 ./c/
 d------ 00000000 11111111        0 ./d/k/
 d------ 00000000 11111111        0 ./e/l/r/
 d------ 00000000 11111111        0 ./f/m/s/x/
 ------- 00000000 11111111       89 ./g/n/t/y/C.xml
 dr----- 00000000 11111111        0 ./h/o/u/z/
 dr-r--- 00000000 11111111        0 ./i/p/v/A/D/
 d--r--- 00000000 11111111        0 ./j/q/w/B/

se tornaria

 drw---- ./a/
 drw---- ./b/
 d------ ./c/
 d------ ./d/k/
 d------ ./e/l/r/
 d------ ./f/m/s/x/
 ------- ./g/n/t/y/C.xml
 dr----- ./h/o/u/z/
 dr-r--- ./i/p/v/A/D/
 d--r--- ./j/q/w/B/

Onde o delimitador inicial é o segundo espaço no arquivo e o delimitador final é ./

Sou muito novo no cygwin e todas são ferramentas inteligentes, por isso não tenho ideia do que fazer. Tenho certeza que eu poderia usar sed e expressões regulares de alguma forma, mas eu simplesmente não sei o suficiente para chegar a solução por conta própria.

    
por Millianz 05.04.2012 / 21:20

3 respostas

2

A maneira mais simples de fazer isso é usar awk .

$ awk '{print $1, $5}' myfile.txt

awk lê o arquivo linha por linha, define algumas variáveis especiais e executa o comando para cada linha. $1 e $5 aqui contêm primeira e quinta cadeia quando uma linha é convertida em tokens usando espaço como delimitador.

    
por 05.04.2012 / 21:45
1

Aqui está o regex que você quer. Abra o arquivo no vim e execute-o, ou faça sed the_expression oldname > newname .

:%s/[0-9][0-9]*//g

Explicação:
O símbolo% especifica que o seguinte comando deve ser executado em todo o arquivo.
s means search/for this expression/and replace it with this one/
No seu caso, você quer apagar todos os números, então nós instruímos o motor regex do vim para procurar todas as ocorrências de um ou mais números e substituí-lo por nada.

    
por 05.04.2012 / 21:46
1

"Onde o delimitador inicial é o segundo espaço no arquivo e o delimitador final é ./"

Aqui está uma feia só para você

C:\sdf>type p.p
 drw---- 00000000 11111111        0 ./a/
 drw---- 00000000 11111111        0 ./b/
 d------ 00000000 11111111        0 ./c/
 d------ 00000000 11111111        0 ./d/k/
 d------ 00000000 11111111        0 ./e/l/r/
 d------ 00000000 11111111        0 ./f/m/s/x/
 ------- 00000000 11111111       89 ./g/n/t/y/C.xml
 dr----- 00000000 11111111        0 ./h/o/u/z/
 dr-r--- 00000000 11111111        0 ./i/p/v/A/D/
 d--r--- 00000000 11111111        0 ./j/q/w/B/
C:\sdf>sed -r "s/(\s+\S+\s*)([^.]*\.\/)/.\//" p.p
 drw---- ./a/
 drw---- ./b/
 d------ ./c/
 d------ ./d/k/
 d------ ./e/l/r/
 d------ ./f/m/s/x/
 ------- ./g/n/t/y/C.xml
 dr----- ./h/o/u/z/
 dr-r--- ./i/p/v/A/D/
 d--r--- ./j/q/w/B/
C:\sdf>
    
por 05.04.2012 / 22:05