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
使用
创建一个循环,该循环一次读取一行文件。因此,每次应用模式时,只能在换行之前进行匹配。