使用perl命令搜索bash for循环语法

时间:2013-01-11 17:34:51

标签: perl bash syntax

我有几个需要修改的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

2 个答案:

答案 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/

至少有两种方法可以更改原始命令行来完成此任务:

  1. 逃离美元符号:

    perl -wpi -e "s/i=\\\$\{BEGIN\}/i=\\\$\{BEGIN\}-1/"

  2. 首选单引号,不用bash进行插值:

    perl -wpi -e 's/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/'