Взято из стандарта C ++:
4.5 Интегральные рекламные акции [conv.prom] 1 Rvalue типа char, signed char, unsigned char, short int или unsigned short int может быть преобразовано на rvalue типа int, если int может представлять все значения типа источника; в противном случае исходное значение rvalue может быть преобразовано в rvalue типа unsigned int.
blockquote>На практике это означает, что все операции (по типам в списке) фактически оцениваются по типу
int
, если он может покрыть все значение, с которым вы имеете дело, иначе оно выполняется наunsigned int
. В первом случае значения сравниваются какunsigned int
, потому что один из них былunsigned int
, и поэтому -1 является «большим», чем 2. Во втором случае значения a, сравниваемые как целые числа со знаком, какint
, вся область какshort
, так иunsigned short
и т. д. меньше 2.(История вопроса: на самом деле все это сложное определение о покрытии всех случаев таким образом приводит к тому, что компиляторы могут фактически игнорировать фактический тип (!) :) и просто заботиться о размере данных.)
Это работает:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip'
(Когда вы используете параметр -r, вам не нужно экранировать скобки.)
Немного пояснения:
-r
- это расширенные регулярные выражения - это влияет на то, как пишется регулярное выражение. -n
не печатает, если не указано иное - sed
печатает по умолчанию в противном случае, -e
означает, что за ним следует выражение. Разберем выражение:
s ///
- это команда для поиска-замены, и то, что между первой парой - это регулярное выражение для сопоставления, а второй парой - замена, gip
, которая следует за поисковой заменой команда; g
означает глобальный, т.е. каждое совпадение, а не только первое, будет заменено в строке; i
нечувствительность к регистру; p
означает печать по завершении (помните флаг -n
из ранее!), dbservername
- это первая часть совпадения, \ s
- это пробел, +
означает один или несколько (vs *
, ноль или более) вхождений, \ w
- это слово, то есть любая буква, цифра или знак подчеркивания, \ 1
- специальное выражение для GNU sed
, которое выводит первое совпадение в квадратных скобках в сопутствующем поиске. Вы убегаете от своего (и). Я почти уверен, что тебе не нужно этого делать. Попробуйте:
sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
Вы не должны избегать вещей, используя одинарные кавычки. т.е.
echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip'
Другие уже упоминали об экранировании скобок, но зачем вообще нужна обратная ссылка, если первая часть строки постоянна?
Вы могли бы просто сделать
sed -e 's/dbservername.*$/dbservername yyy/g'
Тебе не следует убегать от своих родителей. Попробуйте:
echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip'