将 sed 命令与变量一起使用

将 sed 命令与变量一起使用

我已经尝试了 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替换将在标准输出上。

相关内容