为何单独可用的sed命令在Shell脚本中执行失效?
sed命令在Shell脚本中报错“unterminated `s' command”的解决办法
从报错信息和你的脚本输出可以看出,问题出在server_name变量里混入了换行符——你执行echo $server_name后出现了空行,说明这个变量不是单纯的ABC-123,而是带有换行的字符串。
当sed执行s/${server_name}/${sensitive}/g时,换行符会把替换命令拆成两行,导致sed认为你的s命令没有写完,从而抛出“unterminated s' command”错误。而你手动测试单行命令时,server_name`是手动赋值的干净字符串,所以没有这个问题。
解决方法
只需要在获取server_name时,清理掉变量里的换行符即可:
方法1:用tr删除换行/回车符
把脚本中赋值server_name的行修改为:
server_name=$(echo "$line" | awk '{print $11}' | tr -d '\n\r')
tr -d '\n\r'会彻底删除变量中的换行符和回车符,确保变量内容是纯字符串。
方法2:用awk的printf代替print
awk的print命令默认会在输出末尾添加换行,改用printf可以避免这个问题:
server_name=$(echo "$line" | awk '{printf "%s", $11}')
修改后,server_name变量就不会带有多余的换行符,sed命令就能正常完成替换操作了。
内容的提问来源于stack exchange,提问作者Sugalak
相关产品推荐
相关产品推荐

