Использование sed для замены числа, расположенного между двумя другими числами - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно заменить числовое значение, которое встречается в определенной строке из ряда файлов конфигурации в шаблоне, подобном следующему:

string number_1 number_to_replace number_2

Я хочу получить что-тонапример:

string number_1 number_replaced number_2

Сложности, с которыми я столкнулся:

  • number_1 или number_2 могут быть равны number_to_replace, поэтому простая замена невозможна.
  • число_1 и число_2 различаются в разных конфигурационных файлах, поэтому я не знаю их заранее.

Самая близкая попытка, которую я получил до сих пор:

echo "field 4 4 4" | sed 's/\s4\s/3/'

Какие выходы:

field34 4

Это близко, учитывая, что я хочу заменить промежуточное число, я добавил еще один "\ s", чтобы попытаться использовать известный факт, что строка начинается с символа.

echo "field 4 4 4" | sed 's/\s\s4\s/3/'

Что дает:

field 4 4 4

Итак, на этот раз ничего не заменяется.Как я могу продолжить?Несколько подробное объяснение было бы идеальным, потому что мои знания о замене выражений, которые включают шаблоны почти в ноль.Спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете сделать что-то вроде ниже, что соответствует вашей точной последовательности цифр, как в примере.Вы можете заменить 3 на любую цифру по вашему выбору.

sed 's/\([0-9]\{1,\}\)[[:space:]]\([0-9]\{1,\}\)[[:space:]]\([0-9]\{1,\}\)/\1 3 \3/'

Обратите внимание, что я использовал скобочное выражение POSIX для соответствия символу пробела, который должен поддерживаться в любом варианте sed.с помощью.Обратите внимание, что \s поддерживается только в вариантах GNU.

Буквальное значение определения регулярного выражения заключается в совпадении с одной цифрой, за которой следует пробел, затем цифра, пробел и другая цифра.Захваченные группы сохраняются из \1.Поскольку вы намерены удалить цифру 2 nd , замените ее на слово по вашему выбору.

Если из-за лишних экранирований его невозможно прочитать, используйте флаг -E для расширенного регулярного выражения.служба поддержки.Я использовал стандартную BRE версию

...