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.
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?
$ echo "$a"
[MOVING] From [/source/foo.txt] to [/dest/bar.txt]
$ echo "$a" |egrep -o '\[.[^ ]+\]$'
[/dest/bar.txt]
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.