2016-02-13 3 views
3

I tried-Почему не [0-9] + соответствует «123» в «123 abc» с sed?

echo "abc 456" | sed 's/[0-9]+/& &/' 

и ожидает "а 456 456", но он просто печатает "а 456".

Не стоит ли [0-9] + цифры «1 или больше»?

Кроме того, если я

пытаясь угадать
echo "abc 456" | sed 's/[0-9]*/& &/' 

он печатает "а 456". Обратите внимание на пробел перед abc. Означает ли это, что 1-й символ - это цифра?

+0

'' s/[0-9] */& &/''легко:' * 'соответствует 0 или больше, поэтому он просто соответствует 0 цифрам. Это не требует утверждения, что любой символ («первый» или другой) является цифрой вообще. –

+1

в первом примере вам нужно добавить sed -r OR \ before + – josifoski

ответ

6

Не используйте флаг -r для sed, он использует синтаксис BRE, а не ERE. + - расширение ERE.

echo "abc 456" | sed -r 's/[0-9]+/& &/' 

Что касается других вопросов отрасли: * матчи 0-или-больше символов, так

echo "abc 456" | sed 's/[0-9]*/& &/' 

... не требует каких-либо цифр вообще существовать (и на самом деле способный сопоставить пустую строку), поэтому он ничего не говорит о том, считается ли начальная позиция числовой.

+0

@ hek2mgl, мой второй пример цитировал их собственный код, не предоставляя никакого модификатора, показывающего, как его изменить. Я не вижу смысла в исправлении его по своей сути нарушенного, тогда как первый фрагмент имеет достаточный смысл, чтобы иметь четкое намерение. –

-1

sed знает два типа регулярных выражений, простые и расширенные, одним словом: используйте echo "abc 456" | sed -r 's/[0-9]+/& &/', чтобы включить расширенное регулярное выражение, которое поддерживает + без цитирования. Или используйте \+ вместо + в исходной команде (sed в режиме основного регулярного выражения).

+1

'\ +' - расширение GNU; POSIX не требует поддержки BRE. –

Смежные вопросы