Extrai o terceiro grupo de texto dos delimitadores de intervalo

0

Eu tenho um arquivo.txt que contém a única linha:

[MOVING] From [/source/foo.txt] to [/dest/bar.txt]

Eu gostaria de encontrar um regex que basicamente extraia o terceiro grupo dentro de um par de colchetes []

esperando /dest/bar.txt

Até agora, eu criei:

$> cat file.txt | grep ".*From.*to.*" | grep -oP  '(?<=to ).*$' | cut -d "[" -f 2 |  cut -d "]" -f 1

que funciona mas não gosta de uma solução elegante. Alguém tem uma ideia de como conseguir isso?

    
por Pierre Roudaut 02.06.2017 / 18:22

3 respostas

1
grep -o '\[[^]]*\]$' file.txt | sed 's/\[//; s/\]//'

Isso ancora o grep ao final da linha, depois extrai os colchetes e o texto desejado. O comando sed retira os colchetes.

    
por 02.06.2017 / 18:29
1
$ echo "$a"
[MOVING] From [/source/foo.txt] to [/dest/bar.txt]
$ echo "$a" |egrep -o '\[.[^ ]+\]$'
[/dest/bar.txt]
    
por 02.06.2017 / 22:13
1

Você pode usar cut para extrair a peça após o colchete de abertura de seu interesse e concluir com sed para remover a peça após o colchete de usinagem.

cut -d '[' -f 3 | sed 's/].*//'

Como alternativa, você pode fazer isso em um único comando sed ou awk.

sed 's/^[^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\].*$//'
gawk -F '(^|\])[^[]*(\[|$)' '{print $4}'
awk '{split($0, a, "(^|\])[^[]*(\[|$)"); print a[4]}'

Nos dois comandos awk, o campo 1 está vazio porque o primeiro separador começa no início da string, então o terceiro grupo é o campo 4.

    
por 04.06.2017 / 02:42