sed: 4개의 공백(줄 시작 부분)을 2개의 공백으로 바꿉니다.

sed: 4개의 공백(줄 시작 부분)을 2개의 공백으로 바꿉니다.

들여쓰기가 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은 수정된 코드입니다.

관련 정보