Три вещи: вам все еще нужно echo
в конвейере, вам нужно $( )
для захвата вывода из конвейера, чтобы вы могли присвоить его переменной, и вы должны использовать двойные кавычки вокруг ссылок на переменные (для исключить возможные странности):
for filename in ./unsent_xmls/*.xml; do
package=$(echo "$filename" | perl -lne 'print $& if /(\d{4})(?=-)/')
echo "$package"
done