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),我不應該格式化我的程式碼。即使我有完美的正規表示式(如答案中提供的),我也會遇到問題,如果我不小心應用正規表示式超過 1 次,縮排會再次被破壞。 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 將是您修改後的代碼。

相關內容