sed:将每行开头出现的 4 个空格替换为 2 个空格

sed:将每行开头出现的 4 个空格替换为 2 个空格

假设我有这个(puppet)文件,其缩进为 4 个空格(我有很多需要处理的文件):

# init.pp
class hardwareid (
    $package_name      = $hardwareid::params::package_name,
    $package_category  = $hardwareid::params::package_category,
    $package_ensure    = $hardwareid::params::package_ensure

) inherits hardwareid::params {

    package { "${package_name}":
        name      => $package_name,
        category  => $package_category,
        ensure    => $package_ensure,
    }
}

我想使用 sed 将行首的每个 4 个空格替换为 2 个空格,以获得以下结果:

class hardwareid (
  $package_name      = $hardwareid::params::package_name,
  $package_category  = $hardwareid::params::package_category,
  $package_ensure    = $hardwareid::params::package_ensure

) inherits hardwareid::params {

  package { "${package_name}":
    name      => $package_name,
    category  => $package_category,
    ensure    => $package_ensure,
  }
}

到目前为止我想到的是:

sed -i -e 's/^\s\{4\}/  /g' init.pp

但这不仅会取代 1x4 空间的出现,因此不包括更深的缩进。

是否有一个正则表达式可以将行首的每个 4xspace 替换为 2xspace?使用简单的正则表达式和 sed 是否可行,还是我必须切换到 awk/perl/python/ruby,因为我必须计算出现的次数才能用相同的数字替换它们?

编辑

这个问题很愚蠢(尽管对于一个简单的案例,它都可以)。但是如果没有能够理解我的代码语言的工具(即 Puppet),我就不应该格式化我的代码。即使我有完美的正则表达式(如答案中提供的),我也会遇到一个问题,如果我不小心多次应用正则表达式,缩进就会再次被破坏。Puppet 的人正在解决这个问题:http://projects.puppetlabs.com/issues/8031直到问题解决之前,我转换文件时必须小心谨慎。或者自己写一个真正的格式化程序(这应该不难)。

答案1

perl -pe 's{^((?:    )+)}{substr($&, length($&)/2)}e'

答案2

您可能尝试使用错误的工具。您可能会找到 sed 解决方案,但有一个为此构建的工具可以更快地完成。

http://perltidy.sourceforge.net/

看一下 perltidy。它是大多数发行版中可用的 perl 模块。

如果安装正确,可以通过输入“perltidy”来调用它。要实现您所寻找的功能,请按照以下步骤操作。

perltidy -i=2 <filename> 

这应该会创建一个带有更改的新文件,扩展名为 .tdy。虽然 perltidy 最初是为 perl 编写的,但它可以并且确实适用于许多其他语言的代码。它可以在流行的编辑器中轻松调用,并与通用的 .tidyrc 结合使用,可用于维护/执行编码标准。有广泛的选项可供您控制其处理代码的各个方面。

答案3

由于 perltidy 答案对您的代码不起作用,请使用此答案。

perl -pe 's{^(\s*)}{" " x (length($1)/2)}e'

在行尾传递文件的名称或将文件导入 STDIN。STDOUT 将是您修改后的代码。

相关内容