Я хочу заменить шаблон "uid=", за которым следует любой одиночный символ, один или несколько раз. Поэтому я использую эту команду:
sed s/uid=.+/uid=something/g file
Но это не работает. Кажется, что "с последующим любым одиночным символом один или более раз" неверно, то есть .+
Есть идеи, почему?
В BSD sed
или последних версиях GNU и busybox sed
вы можете использовать
sed -E 's/uid=.+/uid=something/'
для совпадения одного символа один или несколько раз.
Флаг -E
для sed
включает расширенные регулярные выражения. Без него вы получите базовые регулярные выражения. Два набора грамматик регулярных выражений в основном одинаковы, но используют немного разный синтаксис, а расширенный набор поддерживает больше операторов.
Это заменит
uid=110
на
uid=something
. Если вы хотите сопоставить тот же символ --не с BSD sed
--:
sed -E 's/uid=(.)\1*/uid=something/'
Это заменит
uid=110
с
uid=something0
Стандартные ERE не имеют обратных ссылок. GNU sed
поддерживает его как расширение, но не BSD sed
. Тем не менее, обратные ссылки являются функцией стандартных BRE, поэтому вы можете:
sed 's/uid=\(.\)\1*/uid=something/'
сделать их переносимыми.
sed 's/uid=..*/uid=something/g' file
Или:
sed 's/uid=.\{1,\}/uid=something/g' file
для posix sed