2g не работает в sed, чтобы пропустить первое вхождение матча - PullRequest
2 голосов
/ 19 апреля 2020

Я пытаюсь заменить текст в файле xml с помощью sed. Я могу заменить свой текст, но я хочу пропустить первый случай. Я использую 2g, но он не работает. Ошибка не отображается, но с файлом не происходит никаких изменений.

Мой Xml файл:

<file-min-size>10830</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>25600</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>32300</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>13456</file-min-size>
      <rotate-log>true</rotate-log>

Мой ожидаемый результат:

<file-min-size>10830</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>25600</file-min-size>
      <rotate-log>true insertvalue</rotate-log>
<file-min-size>32300</file-min-size>
      <rotate-log>true insertvalue</rotate-log>
<file-min-size>13456</file-min-size>
      <rotate-log>true insertvalue</rotate-log>

Я использую Команда ниже sed.

sed -i 's#</rotate-log>#insertvalue</rotate-log>#2g' myfile.xml

Команда выше не работает. если я удаляю 2g, то текст перепечатывается. Я хочу пропустить первый случай. Любая помощь ?

Также, когда я запускаю команду во второй раз, значения вводятся снова. Есть ли способ проверить и заменить только если нет в наличии?

1 Ответ

2 голосов
/ 19 апреля 2020

С GNU sed вы можете использовать

sed -i '/<\/rotate-log>/{:A;n;s#</rotate-log># insertvalue</rotate-log>#;bA}' file

См. online sed demo

Команда находит строку с </rotate-log>, а затем

  • :A - устанавливает метку A
  • n - отбрасывает текущее значение пространства шаблона и считывает в него следующую строку
  • s#</rotate-log># insertvalue</rotate-log># - заменяет </rotate-log> с # insertvalue</rotate-log>
  • bA - идет к метке A (читает следующую строку, заменяет, продолжает).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...