如何用 sed 替换多次出现的模式

如何用 sed 替换多次出现的模式

我使用以下命令删除 PHP 文件中字符串或整数数组键之间的周围空格:

sed -ri "s/\[ ([0-9]+|(\x27|\x22).*(\x27|\x22)) \]/[\1]/g" file.php

我以为我已经涵盖了所有基础,但是当同一行上有多个数组括号时它会失败,所以这样:

if ( $myarray[ 'id' ] == 7 && $myarray[ 'status' ] == true )

就变成这样了:

if ( $myarray['id' ] == 7 && $myarray[ 'status'] == true )

当它看起来应该像这样:

if ( $myarray['id'] == 7 && $myarray['status'] == true )

它删除了第一组括号右侧的空格和第二组括号左侧的空格。

如何修改该命令,以便它将替换整个文件每行上所有数组括号之间的空格?

答案1

你的问题来自.*.如果您只匹配不是 ' 或 " 的每个字符,它将起作用:sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^\x27\x22]*(\x27|\x22)) \]/[\1]/g" file.php

更好(考虑到可能的“或”):

sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^\2]*(\2)) \]/[\1]/g" file.php

相关内容