【问题标题】:Shell sed - "unterminated `s' command" in Windows / "unescaped newline inside substitute pattern" in MACShell sed - Windows 中的“未终止的 `s' 命令”/MAC 中的“替代模式内未转义的换行符”
【发布时间】: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


【解决方案1】:

sedscape 中的回声造成了错误……只需删除它们即可解决问题。

  echo " >>> sedscape"
  echo "1 :: ${1}"

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2019-05-04
    • 2018-05-29
    • 2013-06-11
    • 2012-05-05
    • 2012-07-10
    相关资源
    最近更新 更多