Регулярное выражение ^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$ должно работать.
^ соответствует началу строки
[^a-zA-Z]* соответствует нулю или большему количеству вхождений не-буквы
[a-zA-Z]+ соответствует одному или нескольким вхождениям буквы
[^a-zA-Z]* соответствует нулю или большему количеству вхождений не-буквы
$ соответствует концу строки
Таким образом, он будет игнорировать начальные и последующие не-буквы в строке и совпадать только в том случае, если между первой и последней буквой нет ни одной буквы.
Скобка указывает группу захвата, которая является частью, которую мы хотим извлечь и напечатать. Первоначально я написал и протестировал это для .NET, но вот команда sed . Не спрашивайте меня, как работает sed , я понятия не имею.
sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/p' inputfile
Вместо печати вы можете записать непосредственно в выходной файл:
sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/w outputfile' inputfile