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 (...) .