PCRE regex для sed regex - PullRequest
       13

PCRE regex для sed regex

1 голос
/ 18 января 2010

Прежде всего, извините за мой плохой английский. Я немецкий парень.

Приведенный ниже код отлично работает в PHP:

$string = preg_replace('/href="(.*?)(\.|\,)"/i','href="$1"',$string);

Теперь Т нужно тоже самое для sed. Я думал, что это должно быть:

sed 's/href="(.*?)(\.|\,)"/href="{$\1}"/g' test.htm

Но это дает мне эту ошибку:

sed: -e выражение # 1, символ 36: неверная ссылка \ 1 на команду `s ' RHS

Ответы [ 6 ]

3 голосов
/ 18 января 2010

sed не поддерживает не жадное совпадение с регулярным выражением.

2 голосов
/ 18 января 2010
sed -e 's|href=\"\(.[^"][^>]*\)\([.,]\)\">|href="\1">|g' file
2 голосов
/ 18 января 2010

Вам нужен обратный слеш перед скобками, на которые вы хотите сослаться, таким образом

sed 's/href="\(.*?\)(.|\,)"/href="{$\1}"/g' test.htm
0 голосов
/ 18 января 2010

вот решение, оно не префектное, имеет дело только с одной дополнительной "," или "."


sed -r -e 's/href="([^"]*)([.,]+)"/href="\1"/g' test.htm
0 голосов
/ 18 января 2010

Если вы хотите соответствовать литералу ".", Вам нужно экранировать его или использовать в классе символов. В качестве альтернативы сокращению круглых скобок (что необходимо сделать с базовыми RE), вы можете использовать опцию -E, чтобы указать sed использовать расширенные RE. Наконец, RE, используемые sed, используют \N для ссылки на подшаблоны, где N - это цифра.

sed -E "s/href=([\"'])([^\"']*)[.,]\1/href=\1\2\1/i"

У этого есть своя собственная проблема, которая предотвратит совпадения атрибутов href, которые используют оба типа кавычек.

man sed и man re_format предоставят больше информации о RE, используемых в sed.

0 голосов
/ 18 января 2010

Вы должны экранировать символы выбора блока ( и ) следующим образом.

sed 's/href="\(.*?\)\(.|\,\)"/href="{$\1}"/g' test.htm
...