【发布时间】:2020-12-14 11:58:02
【问题描述】:
我正在尝试修复以前在 MAC 上运行的旧 shell 脚本以在 Windows 上运行...但是我在两台机器上都面临错误 WRT 一个特定的 sed 操作。代码 sn-p 是:
echo "1 :: ${1}"
echo "2 :: ${2}"
sed -i.bak 's/^export \('${1}'=\)\(.*\)/export \1"'"$(sedscape ${2})"'"/' ~/.bash_profile
rm -f ~/.bash_profile.bak
函数sedscape是:
function sedscape() {
echo " >>> sedscape"
echo "1 :: ${1}"
echo ${1//\//\\/} | sed 's/'\''/'\'\\\\\'\''/'
}
这在 Windows 上给了我以下错误:
1 :: AWS_ACCESS_KEY
2 ::
sed: -e expression #1, char 59: unterminated `s' command
在 MAC 上:
1 :: AWS_ACCESS_KEY
2 ::
sed: 1: "s/^export (AWS_ACCESS_ ...": 替代模式内未转义的换行符
.bash_profile 只有一行:
export AWS_ACCESS_KEY="aaaa"
据我所知,它从 .bash_profile 中读取以“export”开头的每一行,并用“2”中的任何内容替换它的值......但它甚至在“sedscape”一半之前就失败了(表达式的后半部分)被评估。 如果对sed命令的理解有误,请指正。
请帮忙!!!
【问题讨论】:
-
您对 sed 命令的理解可能是正确的。原作者对 sed 的了解绝对有限,而且这段代码……丑陋。任何用
s///替换的sed 都可以重新编码为s###或s|||或s@@@或/以外的任何字符,这当然在路径中被广泛使用。 -
不过,我担心该 AWS 密钥中的特殊字符意味着您无法使用替换。最好删除该行,然后替换它。
sed -i.bak "/export $1/d" ~/.bash_profile; echo "export $1=$2" >> ~/.bash_profile或类似的东西。
标签: windows macos powershell shell sed