【问题标题】:sed: -e expression #1, char 93: unterminated `s' commandsed: -e 表达式 #1, char 93: 未终止的 `s' 命令
【发布时间】:2020-11-25 10:20:18
【问题描述】:

我正在使用以下脚本:

#!/bin/bash
echo "============================"

#Convert jpeg file to base64 format
var=`base64 HTMLImage1.jpg`
echo $var
sed -i 's|HTMLImage3.png|'"${var}"'|' Test.html

echo "============================"

将 jpg 文件转换为 base64 文件格式,然后将第一次出现的字符串“HTMLImage3.png”替换为 base64 编码的字符串。我在我的控制台上得到了 base64 编码,所以这没有问题。但是在用 base64 编码的字符串替换字符串“HTMLImage3.png”时,我遇到了以下问题:

sed: -e expression #1, char 93: unterminated `s' command

以下是 base64 编码字符串示例:

iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAhw0lEQVR4Ae1daXRV13XemkeEsAQI
EPNsMAgw2MvGxkAIeIiTeIhdN3FjMvxokq60XaurWe2fZrlD1mrXSptVp7HjuHHS2ElwYyexMTZO
iB0bBDYYIUYxz6ABoXl6Ur/v3Heerp7uu3p6urLVp71t3r3vnnP2Oec7+ztnn+FdpfRAREURUAQ8
EUj3fKoPFQFFwCCgBFFDUAR8EFCC+ICjQYqAEkRtQBHwQUAJ4gOOBikCShC1AUXABwEliA84GqQI
KEHUBhQBHwSUID7gaJAioARRG1AEfBBQgviAo0GKgBJEbUAR8EFACeIDjgYpAkoQtQFFwAcBJYgP
OBqkCChB1AYUAR8ElCA+4GiQIqAEURtQBHwQUIL4gKNBioASRG1AEfBBQAniA44GKQJKELUBRcAH
ASWIDzgapAgoQdQGFAEfBJQgPuBokCKgBFEbUAR8EFCC+ICjQYqAEkRtQBHwQUAJ4gOOBikCShC1
AUXABwEliA84GqQIKEHUBhQBHwSUID7gaJAioARRG1AEfBBQgviAo0GKgBJEbUAR8EFACeIDjgYp
AkoQtQFFwAcBJYgPOBqkCChB1AYUAR8ElCA+4GiQIqAEURtQBHwQUIL4gKNBioASRG1AEfBBQAkS
BqfHB6TRGJQyGivtUWclSBgUNQgP69BHMqoJ0oNhIwXMqG1sl/v+fae0dIYkHQ9G62iSgrq3AYOZ
Rbmy5eu3SnZGqsFiNHceo5sgaP4U/NcR6pZdR2tFWrtEUlPRb45SirC36AjJ2cn50s3eg8LLKGbI.....

我的 base64 编码字符串也包含“/”字符。 shell脚本中的sed命令有什么不正确的地方吗?

【问题讨论】:

  • 如果我将 base64 输出直接通过管道传输到 sed 命令,而不是将其保存在变量中。那么我将如何指定我必须替换字符串的 base64 编码字符串。我试过执行:base64 HTMLImage1.jpg|sed -i 's|HTMLImage3\.png|'"${var}"'|' Test.html 但它没有帮助,因为现在 var 变量中没有值。所以在我的输出中 HTMLImage3.png 被空字符串替换。
  • 我不必替换包含“HTMLImage3.png”字符串的整行,而只需将文本“HTMLImage3.png”替换为base64编码的字符串。
  • 我的第一个建议是更改输出的存储方式。var=`base64 HTMLImage1.jpg | sed '$!s/$/\\/'`
  • #!/bin/bash echo "============================" #将jpeg文件转换为base64 格式 var=base64 HTMLImage1.jpg | sed '$!s/$/\\/' echo $var sed -i 's|HTMLImage3\.png|'"${var}"'|' Test.html #base64 HTMLImage1.jpg|sed -i 's|HTMLImage3\.png|'"${var}"'|' Test.html 回显“=============================”。使用您的建议,现在我收到以下错误:sed: -e expression #1, char 8: unterminated `s' command.
  • 我认为sed 不喜欢命令中的换行符。终止管道字符应与s 命令的开头位于同一行。

标签: bash shell unix sed sh


【解决方案1】:

这可能对你有用(GNU sed 和 bash):

sed -E 's#(.*)HTMLImage3.png(.*)#echo "\1$(base64 -w0 HTMLImage1.jpg)\2"#e' file

用传递给base64的所需文件的输出替换所需的字符串。

注意整行必须在替换命令的 RHS 中表示,因此必须在echo 命令中捕获并重新显示匹配的左右内容。 base64 的 -w0 选项删除用于包装输出的任何换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2021-06-26
    • 2019-03-17
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多