Скажімо, у мене є цей (маріонетковий) файл з відступом у 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, оскільки я повинен рахувати випадки, щоб замінити їх тим же номером?
EDIT
Це питання дурне (хоча для простого випадку все працює). Але я не повинен форматувати свій код без інструменту, який розуміє мову мого коду (який є ляльковий). Навіть якщо я маю ідеальний регулярний вираз (наприклад, як це передбачено у відповідях), у мене є проблема, що якщо я випадково застосую регулярний вираз більше 1 разу, відступ знову порушується. Хлопці ляльок працюють над цим питанням: http://projects.puppetlabs.com/issues/8031 поки не буде вирішено, я повинен бути обережним при конвертації файлів. Або напишіть собі справжній форматер (який не повинен бути таким жорстким).
^
(початок рядка) ...