我已经尝试了 Stack Overflow 及其相关网站上提供的所有可能的解决方案,但没有找到任何解决方案。我在这个问题上花了相当多的时间,终于发布了这个问题。
我想将sed
命令与 shell 变量一起使用。我的脚本非常简单:
## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace
##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with
## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry ## $entry is the variable that contains the file name
这两个echo
命令分别给出以下输出:
PARTITIONEDED BY (date_key ); ## the text I want to be replaced
PARTITIONED BY ( date_key int ); ## the text I want to replace with
我要么收到错误:
sed: -e expression #1, char 2: unterminated `s' command
或者文本根本没有被替换。
请有人帮忙。我正在使用 Centos 6(如果有的话)。提前致谢!
答案1
sed: -e expression #1, char 2: unterminated `s' command
错误消息显示错误发生在第二个字符上,这看起来很奇怪。我可以通过在第一个变量的开头添加换行符来重现这一点:
$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command
未转义的换行符终止 sed 命令。当然,稍后放入换行符a
会在后面的字符上产生错误。
您确实在脚本的前面打印了这两个变量,但它们没有被引用,因此它们中的任何前导空格都将被删除,中间的空格将显示为单个空格。
检查变量实际包含的内容,如下所示:
printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"
后者是 Bash 功能,它以 Bash 接受作为输入的方式显示引用的字符串。set -x
还会显示 sed 命令行的内容,但您需要注意其输出中的文字换行符。
因此,如果只有一个前导换行符,您可以在脚本的开头删除它:
to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}
(您可以将它们合并为一个,但即使换行符不存在,单独的步骤也可以工作。)
答案2
尝试这个
sed -i -e "s@$to_replace@$replace_with@g" "$entry"
在哪里
-i
意味着“就地”替换,如果不使用-i
替换将在标准输出上。