Регулярное выражение ^[^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