假设我有这个(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 将是您修改后的代码。