sed 不能从 sh 文件工作,而是从命令行工作

sed 不能从 sh 文件工作,而是从命令行工作

sedsh从命令行工作,但如果将其放入文件并执行它则不起作用。我想更改现有文件中的数字并将其定向到新文件,所以我尝试了以下操作:

echo enter number 
read num
var1='more ods2.sql | egrep -e "test" | cut -c 5-7' 
sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

如果我在提示中执行这些语句,它们就会执行所需的结果。我$var1用我传递的字符串替换,例如12345

sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

从提示中这也可以正常工作:

more ods2.sql | egrep -e "test" | cut -c 5-7'

如果我将其放入 shell 脚本中,为什么它不起作用?

答案1

这条线

var1='more ods2.sql | egrep -e "test" | cut -c 5-7'

应该

var1=`more ods2.sql | egrep -e "test" | cut -c 5-7`

即您需要使用反引号而不是单引号(撇号)。

答案2

more旨在在终端中工作。更简单的方法是

var1=$(< ods2.sql grep "test" | cut -c 5-7)
sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

挑剔:不过要小心第一行。您正在假设要从 ods2.sql 中提取的文本的位置和长度。我不知道var1应该是什么样子,但这里有一个假设它是一个数字的例子:

var1=$(< ods2.sql sed -n 's/test\([:digit:]*\)/\1/p')
if ! [ -n "$var1" ]  # sed didn't find the pattern
    # complain, exit
fi

相关内容