LINUX.ORG.RU

sed, \d, PCRE и поиск цифр

 , , ,


0

1

Я что-то не пойму: sed до сих пор не умеет работать со стандартом PCRE?

Опция "-r" (она же "-E") включает расширенные регвыры, но это не подмножество PCRE? В мануале написано «use extended regular expressions in the script», но не написано что подразумевается под этим extended.

Спрашиваю потому, что не могу через «\d» найти цифру даже если включить опцию -r/-E.

★★★★★

Ответ на: комментарий от gnu_linux

Строка

host    all             all             127.0.0.1/32            md5


Код для замены строки
regExp='^host\s*all\s*all\s*\d+\.\d+\.\d+\.\d+\/\d+\s*md5'
line='host    all             all             0.0.0.0/0            md5'                                                             
cmd="sed -r 's|$regExp|$line|' $fileName > /tmp/sed.txt"                                                                            
echo "$cmd" | bash


И он не работает. А если вместо «\d» писать «[0-9]», то работает.

Xintrea ★★★★★ ()
Ответ на: комментарий от anonymous

sed 's/[[:digit:]]\+/тут было число/'

Вместо \d писать [[:digit:]]? Двадцать первый век на дворе.

Вопрос на самом деле был про стандарты. Что имеется в иду под extended - непонятно. Документация на sed, одну из главных программ, работающих с регвырами, полный шлак, и всем плевать на протяжении десятилетий.

Xintrea ★★★★★ ()

sed до сих пор не умеет работать со стандартом PCRE?

А должен?

Он должен соответствует IEEE 1003.2 (POSIX.2), остальное — шашечки.

Опция «-r» (она же «-E») включает расширенные регвыры, но это не подмножество PCRE?

PCRE и Extended REs — это разные вещи.

mord0d ★★★ ()

но не написано что подразумевается под этим extended.

Потому что это написано в regex(7), непонятно правда, почему sed(1) на него не ссылается (grep(1) от GNU grep ссылается, хотя сам содержит его пересказ).

ABW ★★★★ ()
Ответ на: комментарий от anonymous

info sed

Наконец нашел про extended. Различий от дефолта немного:

5.4 Overview of extended regular expression syntax
==================================================

The only difference between basic and extended regular expressions is in
the behavior of a few characters: '?', '+', parentheses, braces ('{}'),
and '|'.  While basic regular expressions require these to be escaped if
you want them to behave as special characters, when using extended
regular expressions you must escape them if you want them _to match a
literal character_.  '|' is special here because '\|' is a GNU extension
- standard basic regular expressions do not provide its functionality.

Examples:
'abc?'
     becomes 'abc\?' when using extended regular expressions.  It
     matches the literal string 'abc?'.

'c\+'
     becomes 'c+' when using extended regular expressions.  It matches
     one or more 'c's.

'a\{3,\}'
     becomes 'a{3,}' when using extended regular expressions.  It
     matches three or more 'a's.

'\(abc\)\{2,3\}'
     becomes '(abc){2,3}' when using extended regular expressions.  It
     matches either 'abcabc' or 'abcabcabc'.

'\(abc*\)\1'
     becomes '(abc*)\1' when using extended regular expressions.
     Backreferences must still be escaped when using extended regular
     expressions.

'a\|b'
     becomes 'a|b' when using extended regular expressions.  It matches
     'a' or 'b'.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Для использования стандарта на регвыры PCRE

Где в документации sed написано, что используется pcre?

Если очень хочется «sed c pcre», то вызывай perl -pe 's/\d+/число/'

anonymous ()