Eu não usaria um loop de shell para processar texto .
Aqui, você pode apenas fazer:
cut -d _ -f 2 < country.txt
Ou se a entrada puder conter linhas sem _
caracteres:
awk -F _ 'NF >= 2 {print $2}' < country.txt
Se o nome do país puder conter o caractere _
e você quiser, em vez disso, retornar a parte da linha entre o primeiro _
e a primeira ocorrência de _raw
ou _clean
, você poderá fazer:
perl -ne 'print $1 if s/^[^_]*_(.*?)_(clean|raw)/' < country.txt
Ou com o GNU grep
:
grep -Po '^[^_]*_\K.*?(?=_clean|_raw)' < country.txt
Com -P
(desde que grep
tenha sido criado com suporte a PCRE), o regexp é compatível com perl. Nesses regexps, \K
redefine o início da string correspondida e (?=...)
é um operador de look-ahead, ou seja, o restante da string corresponde a ...
sem que essa parte seja incluída na parte correspondente. -o
torna grep
a saída da porção casada, então aqui imprime o que corresponde ao .*?
acima, que é o equivalente não-ganancioso de .*
, que é uma sequência de 0 ou mais caracteres, o mais curta possível, neste caso, seguindo uma sequência de 0 ou mais sublinhados ( [^_]*
) encontrados no início da linha ( ^
) seguidos por um sublinhado e supondo que seja seguido por _raw
ou _clean
.
Com pcregrep
, você também pode escrevê-lo:
pcregrep -o1 '^[^_]*_(.*?)_(clean|raw)'
Com -o1
, imprime a parte correspondida pelo primeiro (...)
.