Regex Perl正则表达式移动空格

Regex Perl正则表达式移动空格,regex,perl,Regex,Perl,我试图重新格式化一些代码,特别是条件块,从在行的末尾使用逻辑运算符到行的开头,如下所示: if ($arg == true || $arg != null && $arg != 42 ) {...} 到 sed被证明是不够的,因此我尝试使用perl,例如: if ($arg == true || $arg != null && $arg != 42 ) {...}

我试图重新格式化一些代码,特别是条件块,从在行的末尾使用逻辑运算符到行的开头,如下所示:

    if ($arg == true ||
        $arg != null &&
        $arg != 42
    ) {...}

sed
被证明是不够的,因此我尝试使用
perl
,例如:

    if ($arg == true ||
        $arg != null &&
        $arg != 42
    ) {...}
perl-i'-pe's/(&&&&&\\\\\\\\\\\\)(\s+/$2$1/gs'$file

但是,我得到的结果不正确:

    if ($arg == true
||         $arg != null
&&         $arg != 42
    ) {...}
似乎
(\s+)
只捕获了一个字符,所有剩余的空格都保留在原来的位置。我尝试过的变体也失败了


我做错了什么?

我看到的问题是
-p
开关。它逐行读取输入文件的内容,并一次为每个文件执行正则表达式。这意味着
/s
标志是无用的。
(\s+)
部分匹配换行符,打印它,然后在下一行的开头打印条件,依此类推

通过读取整个内容修复它,并将正则表达式一次性应用于所有内容:

perl -i'' -0777 -pe 's/ (&&|\|\|)(\s+)/$2$1 /g' $file
它产生:

if ($arg == true
    || $arg != null
    && $arg != 42
) {...}

我看到的问题是
-p
开关。它逐行读取输入文件的内容,并一次为每个文件执行正则表达式。这意味着
/s
标志是无用的。
(\s+)
部分匹配换行符,打印它,然后在下一行的开头打印条件,依此类推

通过读取整个内容修复它,并将正则表达式一次性应用于所有内容:

perl -i'' -0777 -pe 's/ (&&|\|\|)(\s+)/$2$1 /g' $file
它产生:

if ($arg == true
    || $arg != null
    && $arg != 42
) {...}

您一次读一行,但您试图匹配跨越两行的文本

简单的解决方案是通过使用
-0777
$/
设置为
unde
将整个文件加载到内存中:

perl -i -0777pe's/ (&&|\|\|)(\s+)/$2$1 /gs' "$file"

您一次读一行,但您试图匹配跨越两行的文本

简单的解决方案是通过使用
-0777
$/
设置为
unde
将整个文件加载到内存中:

perl -i -0777pe's/ (&&|\|\|)(\s+)/$2$1 /gs' "$file"

如果您想认真对待Perl的重新格式化,请下载
Perl::Tidy
并使用它附带的脚本。

如果您想认真对待Perl的重新格式化,请下载
Perl::Tidy
并使用它附带的脚本。

可能有更好的方法,但我得到的是:

perl -pe 's/(&&|\|\|)\s*$/\n/; $p=$1; $m && s/^(\s*)/$1$m  /; $m=$p;' input

这不会读取整个文件,而是会记住上一行的任何结转。

可能有更好的方法,但这就是我得到的:

perl -pe 's/(&&|\|\|)\s*$/\n/; $p=$1; $m && s/^(\s*)/$1$m  /; $m=$p;' input

这不会读取整个文件,而是会记住上一行的任何结转。

-p
使用
创建一个循环,一次读取一行文件。因此,每次应用模式时,只能进行匹配,直到换行。
-p
使用
创建一个循环,该循环一次读取一行文件。因此,每次应用模式时,只能在换行之前进行匹配。