首页 > 解决方案 > 如何修复 sed:sc 中没有以前的正则表达式错误

问题描述

嗨,我正在运行:

sudo sed -i "s/${SERVER_ENVIRONMENT}/$SERVER_ENVIRONMENT/" /etc/nginx/sites-available/default.conf

在 bash 脚本中。

我想将字符串 ${SERVER_ENVIRONMENT} 替换为存储在 /etc/environment 中的环境变量“$SERVER_ENVIRONMENT”的值,但是当我运行 bash 脚本时出现此错误:

sed: -e 表达式 #1, char 0: 没有之前的正则表达式

有谁知道我如何解决这个错误?干杯

标签: bashshellnginxsedenvironment-variables

解决方案


sed 不理解文字字符串,只能理解正则表达式和启用反斜杠的替换文本,有关详细信息,请参阅is-it-possible-to-escape-regex-metacharacters-reliably-with-sed

我会为此使用 awk ,因为它确实允许您使用文字字符串:

awk -i inplace '
    BEGIN { old="${SERVER_ENVIRONMENT}"; new=ENVIRON["SERVER_ENVIRONMENT"] }
    s=index($0,old) { $0=substr($0,1,s-1) new substr($0,s+length(old)) }
1' /etc/nginx/sites-available/default.conf

无论$SERVER_ENVIRONMENT包含哪些字符,上述内容都将起作用。

要使用awk -i inplace '...' fileGNU awk 进行“就地”编辑,就像sed -i '...' file使用 GNU sed 一样。

由于您的变量名称是全大写的,我假设它已导出(请参阅正确的 bash-and-shell-script-variable-capitalization了解我为什么这么说)但如果不是,则在命令行上将其设置为自身,以便您不要不必将其导出即可在以下位置使用ENVIRON[]

SERVER_ENVIRONMENT="$SERVER_ENVIRONMENT" awk -i inplace '...' file

推荐阅读