Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用sed注释掉.env条目_Shell_Sed_Grep - Fatal编程技术网

Shell 使用sed注释掉.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 -

我正在编写一个脚本,它将在.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 -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