Используйте sed, чтобы закомментировать запись .env - PullRequest
2 голосов
/ 08 января 2020

Я пишу скрипт, который будет комментировать и не комментировать поле в файле .env.

sed -i "s/#SENDGRID_API_KEY/SENDGRID_API_KEY/g" $mlEnv 

для комментария

sed -i "s/[^#]SENDGRID_API_KEY/#SENDGRID_API_KEY/g" $mlEnv

для комментария, я использую [^#] чтобы он не добавил еще один #, когда он уже прокомментирован

Но второй не работает, хотя

grep "[^#]SENDGRID_API_KEY" $mlEnv

работает нормально.

Ответы [ 3 ]

2 голосов
/ 08 января 2020

Вы можете использовать

sed -i -E 's/(^|[^#])(SENDGRID_API_KEY)/\1#\2/g' "$mlEnv"

Здесь -E включает синтаксис регулярного выражения POSIX ERE, (^|[^#]) захватывает (в группу 1) либо начало строки, либо любой символ, но # в группе 1 и (SENDGRID_API_KEY) захватывает SENDGRID_API_KEY в группе 2.

Шаблон замены \1#\2 заменяет содержимое группы 1 + # + содержимое группы 2.

Переменные, которые указывают аргумент имени файла обычно должно быть в двойных кавычках.

1 голос
/ 11 января 2020

Еще одна попытка с sed аналогична потонгу:

sed 's/^[[:space:]]*#*[[:space:]]*\(SENDGRID_API_KEY\)/#\1/' file > newfile

Шаблон ^[[:space:]]*#*[[:space:]]*\(SENDGRID_API_KEY\) соответствует любому пробелу, 0+ га sh символам, затем снова любым пробелам и затем слову SENDGRID_API_KEY Захвачено в Группе 1. Замена - # и затем захваченное значение.

1 голос
/ 08 января 2020

Это может работать для вас (GNU sed):

sed -Ei 's/^#?(SENDGRID_API_KEY)/#\1/' file

Это заменит начало строки #SENDGRID_API_KEY или SENDGRID_API_KEY на #SENDGRID_API_KEY.

...