Como sed a expressão certa?

0

Estou lidando com isso há algum tempo e sem sucesso. Preciso sedar isso

1.0.0/hk/base/9/7/56.png2003444

para isso

hk,9,7,56,200,3444

Qualquer ajuda seria appriciated.

Editar.

A primeira linha representa uma string dentro de um arquivo. Segunda linha - o resultado será usado no arquivo CSV.

Esta parte contém um número fixo de caracteres (sempre): 1.0.0/hk/base/ Esta parte pode variar com vários caracteres: 9/7/56 2003444

Foi-me dito que fizesse assim:

-e 's/\/base\//,/g'

que vai retornar:

1.0.0/hk,9/7/56.png2003444

Mas não tenho ideia de como lidar com outras coisas.

    
por newbie_girl 06.10.2016 / 20:18

5 respostas

2

Para essa string, essa transformação deve funcionar:

sed 's|.*/\(.*\)/.*/\(.*\)/\(.*\)/\(.*\)\.png\(...\)\(....\)|,,,,\,|'

Se outras linhas não forem exatamente o formato, você terá problemas - incluindo se as duas últimas partes tiverem comprimentos diferentes.

    
por 06.10.2016 / 20:31
0

Como é um arquivo, eu faço isso no Vim. As expressões regulares muito vívidas de muito mágico são muito legíveis e, portanto, uma boa fonte educacional:

:%s_\v^.{6}([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)\.png(\d{3})(\d{4})_,,,,,,_
  • \v fica muito mágico em
  • ^ start match no início da linha
  • .{6} obtém os primeiros 6 caracteres ( 1.0.0/ )
  • ([^/]+) qualquer coisa que não seja / ( hk )
  • / o /
  • ([^/]+) vimos isso antes (corresponde a base desta vez)
  • / - || - || -
  • (\d+) corresponde a números ( 9 )
  • /(\d+)/(\d+) repete as coisas preciosas ( /7/56 )
  • \.png isso deve ser óbvio
  • (\d{3}) exatamente três números 200
  • (\d{,4}) até 4 números (para tornar isso mais robusto): 3444

(Para usar com sed a cada {}()[] precisa ser escapado e \v removido)

    
por 06.10.2016 / 20:48
0

Você não nos contou sobre a estrutura do texto que está analisando ou sobre o padrão que deseja pesquisar. Então, eu fiz algumas suposições com base no exemplo que você nos deu ( 1.0.0/hk/base/9/7/56.png2003444 ).

Eu usei expressões regulares estendidas ( -r ), pois o escape de parênteses e colchetes dificulta a leitura do script. E eu usei ponto e vírgula ( ; ) em vez de barra ( / ) para separar o comando, para que eu não precise escapar de barras também.

sed -r 's;([0-9]+\.){2}[0-9]+/([a-zA-Z]+)/[a-zA-Z]+/([0-9]+)/([0-9]+)/([0-9]+)\.[a-zA-Z]{3}([0-9]{3})([0-9]{4});,,,,,;g'

    
por 06.10.2016 / 21:27
0

Usando GNU sed , e supondo que as strings ' base ' e ' png ' sejam constantes indesejadas, além de algumas outras suposições:

echo '1.0.0/hk/base/9/7/56.png2003444' | \
sed 's#[^/]*/##;s#base\|png##g;s#//#/#;y#/.#,,#;s/....$/,&/'

Saída:

hk,9,7,56,200,3444

Até agora, esta é a única resposta para a função sed do y , que funciona bem como a ferramenta tr do Unix .

    
por 07.10.2016 / 03:57
0

Obrigado por todas as respostas. Eu sou novo no mundo da programação e isso também é uma coisa nova para mim, então eu acho que preciso aprender muito, já que sed é um método antigo de lidar com essas coisas. No entanto, como eu estava seguindo certa abordagem que eu estava familiarizado, acabei resolvendo o problema assim:

sed -e 's/1.0.0\///g'     \
    -e 's/\/base\//,/g'   \
    -e 's/\//,/g'         \
    -e 's/.png/,/g'       \
    -e 's/,\([0-9][0-9][0-9]\)\([0-9]*\)$/,,/g'
    
por 06.10.2016 / 23:13