2016-04-27 4 views
1

У меня есть строки, подобные этим:Sed конец недопустимый диапазон

volume 5 

vol. 5 

V. 5 

v. 5 

Я пытаюсь превратить их в этот формат:

\textbf{5} 

с этим SED команды

s/\(v[a-Z]*[.]*\) \([0-9]*\)/\1 \\textbf{\2}/ 

но Я продолжаю получать invalid range end. Я что-то делаю с диапазоном 0-9?

+0

'aZ' должен быть' а-запорожец Z' – anubhava

+0

Возможно http://ideone.com/vajhPy? –

+0

Какова ваша переменная LANG? Попробуйте установить его на en_US.UTF-8, если это C. –

ответ

2

Если вы проверили таблицу ASCII, вы увидите, что значение a больше, чем значение Z. Это создает недопустимый диапазон. Кроме того, вам нужно регистронезависимое шаблон, добавить /i модификатор:

echo 'volume 5' | sed 's/\(v[a-z]*[.]*\) \([0-9]*\)/\1 \\textbf{\2}/i' 
echo 'vol. 5' | sed 's/\(v[a-z]*[.]*\) \([0-9]*\)/\1 \\textbf{\2}/i' 
echo 'V. 5' | sed 's/\(v[a-z]*[.]*\) \([0-9]*\)/\1 \\textbf{\2}/i' 
echo 'v. 5' | sed 's/\(v[a-z]*[.]*\) \([0-9]*\)/\1 \\textbf{\2}/i' 

produces

volume \textbf{5} 
vol. \textbf{5} 
V. \textbf{5} 
v. \textbf{5} 
+0

Вы можете увидеть демоверсию, она работает. –

+0

Изменение '[A-z]' => '[a-zA-Z]' исправлена ​​моя проблема, спасибо! –

1

Это работало для меня:

sed -r "s/([vV][a-zA-Z]*[.]*) ([0-9]*)/\1 \\\textbf{\2}/" 
Смежные вопросы