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

Я хотел бы заменить число другим номером в файле XML с помощью команды sed.Конкретный параметр <l_num> принимает значение от 0 до 16.Итак, я использовал регулярное выражение, чтобы сделать это:

sed -i -r 's/<l_num>\b^[0-9]([0-9]*)$\b</<l_num>5</g' test.xml

Выше приведен ввод 5 и должен быть в состоянии выдать вывод в виде строки в test.xml, как показано ниже, заменяя любое число между 0и 16, который уже есть:

<l_num>5</lnum>

По некоторым причинам это не работает.Ожидаемый результат от 0 до 16 и без начальных нулей для однозначных цифр.Например, если я заменю 5 выше на 05, он не должен обновлять XML-файл, когда я делаю это:

sed -i -r 's/<l_num>\b^[0-9]([0-9]*)$\b</<l_num>05</g' test.xml

Что здесь может быть не так?

1 Ответ

0 голосов
/ 01 июня 2018

Regex - не лучший инструмент для работы с файлами XML.Вы можете использовать XMLStarlet и получить то, что вам нужно, используя xml ed -u "//l_num" -v "5" file.xml (то есть ed это XML-файл, ища l_num узлы и u присваивая их v значениям 5.

Если вы не хотите заменять при значении замены 05, вам следует выполнить эту проверку перед использованием команды замены.

Что касается вашего регулярного выражения, проблема заключается виспользуя \b (граница слова) и ^ / $ якоря внутри шаблона. Все, что вам нужно, чтобы исправить этот код, это sed -i -r 's/<l_num>[0-9]+</<l_num>5</g' file, поскольку \b граница слова здесь совершенно не нужна, ^ соответствует только началустроки и $ соответствует концу строки. [0-9]([0-9]*) - который соответствует цифре, а затем 0 или более цифр - может быть переписан как [0-9]+ в синтаксисе POSIX ERE (где + может использоваться длясоответствует 1 или более экземпляров квантифицированного атома.) В GNU sed вы также можете использовать \+ в синтаксисе POSIX BRE, когда вы не используете опцию -r с sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...