【问题标题】:Search for bash for loop syntax using perl command使用 perl 命令搜索 bash 的循环语法
【发布时间】:2013-01-11 17:34:50
【问题描述】:

我有几个 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.

这里的语法错误是什么?

谢谢!

沙基尔

【问题讨论】:

    标签: perl bash syntax


    【解决方案1】:

    使用撇号代替双引号:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        相关资源
        最近更新 更多