들여쓰기가 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/
펄티디를 살펴보세요. 대부분의 배포판에서 사용할 수 있는 Perl 모듈입니다.
올바르게 설치되면 'perltidy'를 입력하여 호출할 수 있습니다. 당신이 찾고있는 것을 달성하려면 다음이 작동해야합니다.
perltidy -i=2 <filename>
그러면 확장자가 .tdy인 변경 사항이 포함된 새 파일이 생성됩니다. Perltidy는 처음에 Perl용으로 작성되었지만 다른 많은 코드 언어에서도 잘 작동할 수 있습니다. 널리 사용되는 편집기 내에서 쉽게 호출할 수 있으며 공통 .tidyrc와 함께 사용하여 코딩 표준을 유지/시행할 수 있습니다. 코드 처리의 모든 측면을 제어할 수 있는 광범위한 옵션이 있습니다.
답변3
Perltidy 답변이 귀하의 코드에서 작동하지 않았으므로 이것을 사용하십시오.
perl -pe 's{^(\s*)}{" " x (length($1)/2)}e'
줄 끝에 파일 이름을 전달하거나 파일을 STDIN으로 파이프하십시오. STDOUT은 수정된 코드입니다.