Если у вас есть 2 многострочные переменные, есть несколько способов их объединения:
объявить переменные для тестирования
$ 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"
использовать цикл bash для чтения строки из каждой переменной:
while read префикс -u3; прочитать суффикс -u4; делать
echo "$префикс$суффикс"
сделано 3<<<"$snap_prefix" 4<<<"$snap_daily"
используйте 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
Вы уже получили ответы с помощью других инструментов, наиболее очевидным из которых является столбец
. Я согласен с тем, что sed
не является предпочтительным инструментом для этого, но если вы уже используете sed
для получения таблицы, неприятно передавать этот вывод другому инструменту только для форматирования. В этом случае используйте что-то вроде этого в конце вашего скрипта:
sed 's/ */ /g;s/ / /g;s/\(.\{20\}\) */\1/g'
Это заменяет все группы пробелов четырьмя пробелами, затем каждый пробел пятью пробелами, таким образом, мы добавили 20 пробелов. Третья команда s
сохраняет первые 20 символов каждого столбца и удаляет оставшиеся пробелы.
Это один из тех случаев, когда я бы не стал использовать 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
awk подход:
awk '{printf("%-20s%-20s%-20s\n",$1,$2,$3)}' file
Вывод:
begining center end
beg12 cen12 end12
beg13 cen end
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
< 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
expand
к результату, используя опцию -t
и перечисляя позиции табуляции. sed 's/ */ /g;s/ / /g;s/\(.\{20\}\) */\1/g'
-> Это дает место в каждом слове.
начало и конец имеют только одно слово. центр состоит из нескольких слов.
beginning center cntr cnt center end
beg12 cen12 cnt cntr end12
beg13 cen center end