Como extrair texto dentro do primeiro par de dois pontos [duplicado]

0

Eu tenho um arquivo de log que salva esse tipo de linha toda vez que um arquivo não pode ser extraído de um tar.

tar: foto/201802131354184186718718.xml: No se puede efectuar open: File exists
tar: foto/201802131365468046840684.xml: No se puede efectuar open: File exists

Eu preciso colocar o texto dentro do primeiro par de dois pontos ":"

Exemplo

foto/201802131354184186718718.xml
foto/201802131365468046840684.xml

Eu tentei usar o grep, mas eu entendi:

$ grep -oP '\:\K[^\:]+' 20180213.tmp 
 foto/201802131354184186718718.xml
 No se puede efectuar open
 File exists
 foto/201802131365468046840684.xml
 No se puede efectuar open
 File exists
    
por Edd Mont 22.03.2018 / 02:50

2 respostas

2

Em primeiro lugar, a maneira mais fácil de fazer isso é com outras ferramentas, por exemplo, cut -d: -f2 20180213.tmp , awk -F: '{print $2}' 20180213.tmp .

No entanto, eu também queria explicar por que o método grep falha. Isso ocorre porque corresponde a todas as strings após um : . Para corrigi-lo, você pode combinar o primeiro : no regex com apenas o primeiro na linha processada, adicionando ^[^\:]* na frente dele. Portanto, qualquer caractere anterior à sua regex original não pode ser : . O comando completo é:

grep -oP '^[^\:]*\:\K[^\:]+' 20180213.tmp

Observe também que você não precisa escapar de : na regex, para simplificar ainda mais com:

grep -oP '^[^:]*:\K[^:]+' 20180213.tmp
    
por 22.03.2018 / 03:42
0

De fato, usar outras ferramentas como o corte é a melhor maneira, mas também quero lançar uma solução sed:

sed -r 's/^[^:]+: ?([^:]+):.*//' 20180213.tmp

Ele procura, desde o início da linha até o segundo cólon, apenas caracteres que não são ':', mas mantém apenas o que está entre o primeiro e o segundo pontos. Eu notei que há um espaço logo antes dos nomes dos arquivos, então eu os removi.

    
por 22.03.2018 / 09:29

Tags