Строка формата с использованием sed

Если у вас есть 2 многострочные переменные, есть несколько способов их объединения:

  1. объявить переменные для тестирования

     $ snap_prefix="test-for-dr-
    тест-для-др-
    тест-для-др-
    тест-для-др-
    тест-для-др-"
    $ snap_daily="2017-03-10-08-00
    2017-03-10-11-00
    2017-03-10-12-00
    2017-03-10-14-00
    2017-03-10-15-00"
     
  2. использовать цикл bash для чтения строки из каждой переменной:

     while read префикс -u3; прочитать суффикс -u4; делать
    echo "$префикс$суффикс"
    сделано 3<<<"$snap_prefix" 4<<<"$snap_daily"
     
  3. используйте pr для преобразования одного потока в 2 столбца (а затем tr для удаления символа табуляции, разделяющего столбцы)

     { echo "$snap_prefix"; эхо "$ snap_daily"; } | пр-2Ц | тр -д '\т'
     

2 и 3 оба выводят:

test-for-dr-2017-03-10-08-00
test-for-dr-2017-03-10-11-00
test-for-dr-2017-03-10-12-00
test-for-dr-2017-03-10-14-00
test-for-dr-2017-03-10-15-00

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

grep -Eo 'test-for-dr-[[:digit:]-]+' snaps.txt
0
17.05.2017, 13:47
6 ответов

Вы уже получили ответы с помощью других инструментов, наиболее очевидным из которых является столбец. Я согласен с тем, что sed не является предпочтительным инструментом для этого, но если вы уже используете sed для получения таблицы, неприятно передавать этот вывод другому инструменту только для форматирования. В этом случае используйте что-то вроде этого в конце вашего скрипта:

sed 's/  */    /g;s/ /     /g;s/\(.\{20\}\) */\1/g'

Это заменяет все группы пробелов четырьмя пробелами, затем каждый пробел пятью пробелами, таким образом, мы добавили 20 пробелов. Третья команда s сохраняет первые 20 символов каждого столбца и удаляет оставшиеся пробелы.

1
28.01.2020, 02:15

Это один из тех случаев, когда я бы не стал использовать sed, я бы использовал printf, особенно формат
%-Ns, который будет дополнять строка с пробелами до тех пор, пока «поле» не займет минимум N символов

#!/usr/bin/env bash

while read first second third
do
    printf "%-20s%-20s%s\n" "$first" "$second" "$third"
done <<- 'EOF' 
    begining center end     
    beg12  cen12  end12
    beg13 cen  end
EOF
1
28.01.2020, 02:15

awk подход:

awk '{printf("%-20s%-20s%-20s\n",$1,$2,$3)}' file

Вывод:

begining            center              end                 
beg12               cen12               end12               
beg13               cen                 end 
1
28.01.2020, 02:15

awk может использоваться для форматирования этих данных с помощью функции printf().

$ awk '{ printf("%-20s%-20s%s\n", $1, $2, $3) }' data.in
begining            center              end
beg12               cen12               end12
beg13               cen                 end

Это предполагает, что данные в файле разделены пробелами.

Чтобы указать ширину столбца в качестве параметра:

$ cols=40
$ awk -v c="$cols" 'BEGIN { fmt=sprintf("%%-%ds%%-%ds%%s\n", c, c) } { printf(fmt, $1, $2, $3) }' data.in
begining                                center                                  end
beg12                                   cen12                                   end12
beg13                                   cen                                     end
2
28.01.2020, 02:15
< yourfile tr -s '\t ' '\t\t' | expand -t 19,39

Результаты

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
begining           center              end
beg12              cen12               end12
beg13              cen                 end

Работа

  • Сначала мы выжимаем все остаточные пробелы и/или TAB только до TAB.
  • Затем мы применяем команду expand к результату, используя опцию -t и перечисляя позиции табуляции.
1
28.01.2020, 02:15
sed 's/  */    /g;s/ /     /g;s/\(.\{20\}\) */\1/g' 

-> Это дает место в каждом слове.

начало и конец имеют только одно слово. центр состоит из нескольких слов.

beginning          center cntr cnt center              end
beg12              cen12  cnt cntr                     end12
beg13              cen center                          end
0
28.01.2020, 02:15

Теги

Похожие вопросы