2013-03-10 3 views
0

Я хотел бы заменить все термины, которые начинаются с хэштегом с новым терминомКак заменить шаблон регулярного выражения на новый термин в sed?

Я использую СЭД, но там, кажется, ошибка синтаксиса

sed 's/#[a-zA-Z0-9]+/replacement/g' terms 

Как я могу исправить мой синтаксис?

ответ

1

sed поддерживает «основное регулярное выражение» (BRE), которое не предлагает + в качестве специального оператора.

Правильная замена + будет

sed 's/#[[:alnum:]]\{1,\}/replacement/g' 

или

sed 's/#[[:alnum:]][[:alnum:]]*/replacement/g' 

GNU sed и недавнее BSD sed предложение "Расширенное регулярное выражение" (ERE) соответствия:

sed -E 's/#[[:alnum:]]+/replacement/g' 

(хотя с GNU sed вы шо пакетирования, вероятно, использовать -r поскольку -E в настоящее время незарегистрированные)

и они также предлагают \+ как расширение BRE,

sed 's/#[[:alnum:]]\+/replacement/g' 

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


@ user784637 Я использовал [[:alnum:]] вместо [a-zA-Z0-9]. Это также соответствовало бы буквам с диакритикой, например.

$ printf "%s\n" ë è é | grep '[a-zA-Z0-9]' 
$ 

против

$ printf "%s\n" ë è é | grep '[[:alnum:]]' 
ë 
è 
é 
$ 

Вы можете использовать либо, что соответствует вашим потребностям ..

+0

Откройте дверцы отсека, HAL – user784637

+0

Прошу прощения, Дэйв, боюсь, я не могу этого сделать. – Scrutinizer

1

На моей версии sed, + ничего полезного не делает. Вместо этого вы должны использовать *.

+0

Это сделал трюк. на 'egrep -E' функция плюса повторяет предыдущий термин 1 или более раз, в то время как звездочка повторяет предыдущий член 0 или более раз. – user784637

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