Использование sed для сопоставления и добавления новой строки в файл конфигурации приводит к дублированию строки

Похоже, здесь есть две проблемы. Во-первых, для определения функции требуется ключевое слово function, по крайней мере, в моей системе, поэтому определение функции должно быть:

function certspotter(){
    curl -s https://certspotter.com/api/v0/certs\?domain\=$1 | jq '.[].dns_names[]' | sed 's/\"//g' | sed 's/\*\.//g' | sort -u | grep $1
}

Затем, как упоминалось в комментариях, скрипт, вызывающий функцию, должен получить файл, содержащий функцию. Поскольку в настоящее время у вас все настроено, это будет:

..bash_profile

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

-2
01.10.2021, 22:25
1 ответ

Предполагая, что вы используете GNU sed, ваш цикл будет добавлять строку со строкой # CONFIG_GREEN=yпосле каждого совпадения с регулярным выражением CONFIG_BLUEв файле test.txt. Он будет многократно добавлять одну и ту же строку в один и тот же файл для каждого имени файла в текущем каталоге, соответствующем шаблону подстановки оболочки test*.txt.

Чтобы получить две строки добавленного текста в test.txt, затем либо

  1. в текущем каталоге существует еще один файл с именем, совпадающим с test*.txt, или
  2. строка текста уже присутствует в файле еще до запуска цикла, возможно, из предыдущего запуска, или
  3. вы используете не тот код, который, по вашему мнению, работает.

Судя по комментариям , это был второй из этих трех случаев.

Чтобы завершить изменения в цикле, используйте переменную цикла в фактическом вызове sed.

for name in test*.txt; do
  sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done

На данный момент я удалил параметр -iдля GNU sed, чтобы вы могли проверить результат и повторно -запустить без изменения каких-либо файлов. Обратите внимание, что если у вас есть достаточное количество файлов, вы можете вызвать sedс шаблоном подстановки имен файлов напрямую, чтобы работать со всеми файлами один за другим. Вы также можете использовать -iдля редактирования места в -при условии, что вы используете GNU sed.

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt
1
02.10.2021, 06:12

Теги

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