sed: заменить часть строки

Взято из стандарта C ++:

4.5 Интегральные рекламные акции [conv.prom] 1 Rvalue типа char, signed char, unsigned char, short int или unsigned short int может быть преобразовано на rvalue типа int, если int может представлять все значения типа источника; в противном случае исходное значение rvalue может быть преобразовано в rvalue типа unsigned int.

На практике это означает, что все операции (по типам в списке) фактически оцениваются по типу int, если он может покрыть все значение, с которым вы имеете дело, иначе оно выполняется на unsigned int. В первом случае значения сравниваются как unsigned int, потому что один из них был unsigned int, и поэтому -1 является «большим», чем 2. Во втором случае значения a, сравниваемые как целые числа со знаком, как int, вся область как short, так и unsigned short и т. д. меньше 2.

(История вопроса: на самом деле все это сложное определение о покрытии всех случаев таким образом приводит к тому, что компиляторы могут фактически игнорировать фактический тип (!) :) и просто заботиться о размере данных.)

37
задан calvinkrishy 2 July 2009 в 13:49
поделиться

5 ответов

Это работает:

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 , которое выводит первое совпадение в квадратных скобках в сопутствующем поиске.
48
ответ дан 27 November 2019 в 03:41
поделиться

Вы убегаете от своего (и). Я почти уверен, что тебе не нужно этого делать. Попробуйте:

sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
2
ответ дан 27 November 2019 в 03:41
поделиться

Вы не должны избегать вещей, используя одинарные кавычки. т.е.

echo "DBSERVERNAME    xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip'
1
ответ дан 27 November 2019 в 03:41
поделиться

Другие уже упоминали об экранировании скобок, но зачем вообще нужна обратная ссылка, если первая часть строки постоянна?

Вы могли бы просто сделать

sed -e 's/dbservername.*$/dbservername yyy/g'
9
ответ дан 27 November 2019 в 03:41
поделиться

Тебе не следует убегать от своих родителей. Попробуйте:

echo "DBSERVERNAME    xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip'
1
ответ дан 27 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: