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