(?<=...) é um operador de PCRE look-behind . Por si só, não corresponde a nada, mas age como uma condição (o que está à esquerda corresponde a ... ).
(?<=X)Y corresponde a Y , desde que o que está à esquerda corresponda a X . Em blahYfooXYbar , que corresponde ao segundo Y , o X não faz parte do que está sendo correspondido. O (?<=X) em si corresponde ao ponto de largura zero ( imaginário ) pouco antes desse Y . Aqui ilustrado:
$ echo X-RAY THE FOX | perl -lpe 's/(?<=X)/<there>/g'
X<there>-RAY THE FOX<there>
Como -o , grep apenas imprime a parte correspondida , é uma maneira de imprimir o que é após o location> (aqui o que corresponde a [^>]+ : um ou mais ( + ) não < caracteres ( [^>] ) então tudo até (mas não incluído) o próximo caractere < ou o final da linha desde que não esteja vazio). / p>
Outra abordagem é usar \K (em versões mais recentes do PCRE) para redefinir o início da parte correspondente:
grep -Po 'location>\K[^>]+'
Observe que -P e -o são extensões do GNU. Com versões recentes (8.11 ou superiores) de pcregrep (outra implementação grep que usa o PCRE), você também pode fazer:
pcregrep -o1 'location>([^>]+)'
( -o1 imprime o que é capturado pelo 1 com (aqui exclusivo) (...) )