bash, удалите только половину пробелов из начала строки

#linux #bash #awk #sed

#linux #bash #awk #sed

Вопрос:

Мне нужно удалить пробелы из начала строки, но только 1/2, например:

     <div class="section" id="contact">
    <div class="container">
        <div class="col-md-12">
            <h4>04</h4>
  

Для

   <div class="section" id="contact">
  <div class="container">
    <div class="col-md-12">
      <h4>04</h4>
  

и т.д.

Заранее спасибо за любое предложение.

Комментарии:

1. Только что удалил все пробелы, но я не знаю, как установить его для half: sed -e ‘s/^[ t] *//’

2. Что вы думаете и что вы пробовали? совет: замените два места одним местом…

3. Что вы на самом деле пытаетесь сделать? Красиво распечатать html-файл?

4. Да, мне нужно указать 2 пробела вместо 4 для каждой строки (например, когда у меня 8 пробелов, мне нужно 4, когда у меня 12 пробелов, мне нужно 6 и т.д. Красиво напечатанный html.

5. Я бы использовал такой инструмент, как Tidy , для красивой печати HTML.

Ответ №1:

использование group в sed

 sed 's/^([[:blank:]]{1,})1/1/' YourFile
  

вы можете использовать пробел вместо [[:blank:]] , если вы уверены, что это пробел, а не табуляция.

это так: замените группу пробелов на эту группу, если она появляется дважды в начале, так что это половина полной группы пробелов

Комментарии:

1. Это создает нежелательные отступы для меня, если он смешивает табуляции и пробелы.

2. это уже так, потому что отступ с табуляцией зависит от настроек редактора. Если необходимо (в запросе это не так). Он должен определить эквивалентность табуляции и способ ее замены (например: 3 пробела табуляция 5 пробелов = ?)

3. Спасибо, это именно то, что мне нужно! Там только пробелы, никаких табуляций, так что все работает хорошо.

4. Если есть сочетание пробелов / табуляций, то сначала следует пропустить исходный файл expand .

5. Я бы предложил изменить * на , чтобы для строк без начальных пробелов sed не приходилось заменять начальную пустую строку пустой строкой.

Ответ №2:

Вы можете попробовать Perl

 perl -pe  's!(^s )!$x=length($1)/2;" " x $x!sme ' input_file
  

с вашими заданными входными данными

 $ cat stanislav.txt
    <div class="section" id="contact">
    <div class="container">
        <div class="col-md-12">
            <h4>04</h4>

$ perl -pe  's!(^s )!$x=length($1)/2;" " x $x!sme ' stanislav.txt
  <div class="section" id="contact">
  <div class="container">
    <div class="col-md-12">
      <h4>04</h4>

$
  

Ответ №3:

Предполагая, что все ваши начальные пробелы являются пустыми символами:

 $ awk 'match($0,/^ */){$0=sprintf("%*s%s", int(RLENGTH/2), "", substr($0,RLENGTH 1))} 1' file
  <div class="section" id="contact">
  <div class="container">
    <div class="col-md-12">
      <h4>04</h4>
  

Если нет, то сначала запустите свой файл через pr -e -t , чтобы сделать это так.