Заменять строку 1 только при наличии строки 2, 3 или 4

Что ж, этот вопрос меня щекочет со вчерашнего дня, когда я впервые прочитал ваш пост.

Как правило, эти две версии apt-get install совпадают, согласно справочным страницам apt-get.

На практике эти две версии действительно идентичны, когда вы пытаетесь установить один или несколько пакетов с известным именем.

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

Эта команда не работает:

apt-get install -s mate*/testing

Хотя эта команда работает нормально:

apt-get install -s -t testing mate*

Похоже, что mate * / testing выполняет поиск из всех пакетов, содержащих mate, и пытается установить все пакеты thos из тестового репозитория. Если некоторые пакеты недоступны в тестовом репозитории, вы получите сообщение об ошибке и apt-get завершится ошибкой.

С другой стороны, параметр -t test mate * выбирает пакеты mate *, доступные только в репозитории для тестирования. Он не пытается искать и устанавливать пакеты mate *, которые недоступны в тестовом репозитории, и поэтому не дает сбоев.

Вы можете попробовать, если хотите использовать вышеуказанные команды, используя опцию -s (simulate), которая позволяет вам видеть все сообщения apt-get в вашем терминале, как если бы они появлялись при реальной установке (но на самом деле ничего не установлены).

PS: Существует также очевидная и незначительная разница между двумя версиями: Работая с версией "/ release", вы можете комбинировать (если хотите) различные пакеты из разных / релизов, а с " -t release "версия, вы устанавливаете глобально выпуск, который будет применяться ко всем пакетам, которые будут следовать за apt-get install.

2
21.08.2018, 06:20
2 ответа

Предполагая, что запись начинается, когда в первом столбце есть текст, вы можете изменить эти три записи с помощью

awk '/^[A-Z]/ { substitute = ($1 ~ /^((SAP|GOLD)_PROD|EVENTS_SAP)$/) }
    substitute { sub(/sape-scan/, "sapi-scan") }1' tnsnames.ora >tnsnames.new

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

В этом скрипте переменная substituteполучает логическое значение, указывающее, соответствует ли строка заголовка регулярному выражению. Если логическое значение истинно, мы выполняем замену в каждой строке, пока не увидим другую строку заголовка, и значение логического значения снова оценивается и, возможно, обновляется.Одинокий 1заставляет печатать каждую строку.

Результат помещается в новый файл, так что вы можете diffи т. д. по сравнению с оригиналом. Если вы удовлетворены результатом, вы можете заменить старый файл, простоmv:присвоив новому файлу имя старого файла.

2
27.01.2020, 22:09

Другой вариант, с sed:

sed -re '/^(SAP_PROD|GOLD_PROD|EVENTS_SAP) =/,/^$/s/HOST = sape-scan/HOST = sapi-scan/' tnsnames.ora
  • включить расширенные регулярные выражения(-r)для |чередования регулярных выражений
  • взять следующий параметр (цитируемый текст )как выражение для оценки(-e)
  • между строками, заключенными в квадратные скобки "SAP _PROD", "GOLD _PROD" или "EVENTS _SAP" в начале строки, за которыми следует пробел и знак равенства, до пустой строки,
  • найдите и замените текст «HOST = sape -scan» на текст «HOST = sapi -scan»
  • в файле tnsnames.ora

Используйте приведенную выше версию, чтобы не -неразрушающее тестирование ваших изменений, возможно, с помощью:

sed... tnsnames.ora > tnsnames.new
diff tnsnames.ora tnsnames.new

... чтобы посмотреть, что изменилось. Во многих реализациях sed вы можете добавить флаг -i, чтобы затем внести изменения «на месте -».

2
27.01.2020, 22:09

Теги

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