0

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

这里的语法错误是什么?

谢谢!

萨基尔

4

2 回答 2

7

使用撇号而不是双引号:

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

这样,shell 不会删除反斜杠,因此 perl 会看到它们并且它们会逃避应该逃避的内容。

于 2013-01-11T17:38:13.560 回答
3

bash shell 在参数"s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/"到达 Perl 之前对其执行插值。让我们看看它是如何工作的:

$ 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/'

于 2013-01-11T17:48:41.853 回答