我有几个需要修改的bash脚本,我非常希望不要手动执行...基本上,它们都包含行
for ((i=${BEGIN} ; i < ${END} ; i++))
我需要将其更改为
for ((i=${BEGIN}-1 ; i < ${END} ; i++))
<=> i = $ {BEGIN}是唯一的,在每个文件中只出现一次,所以我想我可以使用简单的perl命令搜索并替换它。我想出的是
> perl -w -i -p -e "s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/" Script.sh
会导致以下错误
syntax error at -e line 1, near "{BEGIN"
syntax error at -e line 1, near "}continue"
Execution of -e aborted due to compilation errors.
这里的语法错误是什么?
谢谢!
Tsadkiel
答案 0 :(得分:7)
使用撇号而不是双引号:
perl -w -i -p -e 's/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/'
这样,shell不会删除反斜杠,因此perl会看到它们,并且它们会逃脱它们应该逃脱的内容。
答案 1 :(得分:3)
bash shell在它到达Perl之前对参数"s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/"
执行插值。让我们看看它是如何工作的:
$ echo "s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/"
s/i=$\{BEGIN\}/i=$\{BEGIN\}-1/
替换s/i=$\{BEGIN\}/i=$\{BEGIN\}-1/
将成为Perl中的一个问题,因为Perl会将序列$\{
视为对哈希变量%\
的查找的开始,但它将无法编译因为它找不到(未转义的)右括号。所以你真正希望Perl看到的是像
s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/
至少有两种方法可以更改原始命令行来完成此任务:
逃离美元符号:
perl -wpi -e "s/i=\\\$\{BEGIN\}/i=\\\$\{BEGIN\}-1/"
首选单引号,不用bash进行插值:
perl -wpi -e 's/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/'