Распечатайте многострочную переменную в столбце

Что Вы получаете, когда Вы нажимаете Ctrl + Alt + F1 не Xterm или что-либо, чтобы сделать с X или Ваш DE. Это называют TTY (сокращение TeleType, посмотрите здесь для некоторой истории). Команда, которую Вы хотите, kbdrate. -d опция позволяет Вам установить задержку, прежде чем она начнет повторять ключи, и -r позволяет Вам установить уровень, на котором, повторении ключей после того, как они запустили. Необходимо работать kbdrate как корень. Кроме того, не все настройки допустимы, видят страницу справочника для деталей.

6
24.06.2014, 02:32
3 ответа

Может быть, какая-нибудь вещь типа:

svcgroup='foo' autostrtlist=$'sys1\nsys2' hosts=$'sys1\nsys2'
paste <(printf '%s\n' "$svcgroup") \
      <(printf '%s\n' "$autostrtlist") \
      <(printf '%s\n' "$hosts") | expand -t30

(синтаксис ksh93/zsh/bash). Или, POSIXly, в системе с /dev/fd/x:

paste /dev/fd/3 3<<E3 /dev/fd/4 4<<E4 /dev/fd/5 5<<E5 | expand -t 30
$svcgroup
E3
$autostrtlist
E4
$hosts
E5

За исключением dash и yash, можно использовать временные файлы вместо труб, подаваемых подоболочками, так что, скорее всего, это будет более эффективно (в дополнение к тому, что они будут более переносимыми).

.
4
27.01.2020, 20:28

Если они все поместятся на одной линии каждый раз, то это несколько простых способов. Если вы хотите, чтобы именно так, как вы просите, потребуются дополнительные усилия, чтобы колонки были выстроены правильно. Вот основная идея:

#!/bin/bash

inputA="foo"
inputB=$'sys1\nsys2\n'
inputC=$'sys1\nsys2\n'

sgheader="\033[4m\033[1m%-30s %-30s %-15s\033[0m\033[0m\n"
sgformat="%-30s %-30s %-15s\n"

printf "${sgheader}" "Service Group" "Autostart List" "System List"

# This shows two simple ways to do this which use concatenation but
# require that the result still fit in the same space as is used for
# a single line
columnA="$inputA"
columnB=$(echo "$inputB"|awk '{printf("%s,",$0)}'|sed 's/,.\s*$//')
columnC=$(echo "$inputC"|tr '\n' ',')

printf "${sgformat}" "${columnA}" "${columnB}" "${columnC}"

# This is a version which outputs like originally asked. It is much harder
# to tweak the formatting of this version though.
pr -tm <(printf '%s\n' "$inputA") <(printf '%s\n' "$inputB") \
       <(printf '%s\n' "$inputC") | expand -t10

Лучший способ, который я знаю, сделать это так, как вы хотите - это беспорядок. Даже после этого вы можете захотеть дополнительно уточнить вывод, чтобы выстроить его правильно.

1
27.01.2020, 20:28

Можно удалять любые новые строки из переменной.

var=$(echo "$var" | tr -d '\n')
1
27.01.2020, 20:28

Теги

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