Shell 使用sed注释掉.env条目
我正在编写一个脚本,它将在.env文件中注释和取消注释字段Shell 使用sed注释掉.env条目,shell,sed,grep,Shell,Sed,Grep,我正在编写一个脚本,它将在.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 工作正常。您可以使用 sed -
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
工作正常。您可以使用
sed -i -E 's/(^|[^#])(SENDGRID_API_KEY)/\1#\2/g' "$mlEnv"
在这里,-E
启用POSIX ERE正则表达式语法,(^ |[^#]
捕获(到组1)字符串的开头或任何字符,但组1中的
和组2中的(SENDGRID\u API\u KEY)
捕获SENDGRID\u API\u KEY
\1#\2
替换模式将替换为组1内容+\code>+组2内容
指定文件名参数的变量通常应在双引号内。这可能适用于您(GNU-sed):
这将用#SENDGRID_API_键
或SENDGRID_API_键
替换以#SENDGRID_API_键
开头的行再次尝试使用sed
,类似于Poton的:
sed 's/^[[:space:]]*#*[[:space:]]*\(SENDGRID_API_KEY\)/#\1/' file > newfile
^[:space:][]*\[:space:][]*\(SENDGRID\u API\u KEY\)
模式匹配任何空格、0+哈希字符,然后再次匹配任何空格,然后匹配组1中捕获的SENDGRID\u API\u KEY
单词。替换为#
,然后是捕获的值 使用sed-i-E/(^ |[^#]](SENDGRID\u API\u KEY)/\1#\2/g'$mlEnv
它可以工作,你能解释一下吗?你的基本错误是假设[^#]
的意思是“不在前面”。但它实际上意味着“这里需要一个字符,而不是#
”。
sed 's/^[[:space:]]*#*[[:space:]]*\(SENDGRID_API_KEY\)/#\1/' file > newfile