Отформатируйте строку таким образом, чтобы в сценарии posix оболочки было одинаковое количество символов

#shell #scripting #sh

Вопрос:

У меня есть различные переменные, и я хочу напечатать их все одинаковой ширины (по символам). Чтобы достичь этого, мне сначала нужно определить, какая строка самая длинная, и добавить к ней одну строку, а затем распечатать более короткие с такой шириной, заполняя пробелами.

ну, в идеале я хочу, чтобы результат был таким

     IFROGZ FREE REIN 2 "00:00:00:00:B5:C8"
    Mi Phone           "A4:50:46:AC:32:59" 
    realme Watch       "D8:CA:8E:CD:5D:7C"
 

где в случае подключения устройства слева 2 из 4 пробелов становятся астериксом (*), но этот вопрос больше адресован правому заполнению/формированию

printf s $something ' ' $isuppose , не работает, что было бы идеальным решением, но как мне найти ширину для размещения там?

Очень важно то, что это должен быть сценарий, совместимый с POSIX.

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

 inc=$#
inc=$((inc-1))
demon=$(eval printf "$inc"); 
inc=$((inc-2))
tellar=$(eval printf "$inc"); 
demon=${demon:1:-1}$tella$tellar
inc=$((inc-1))
while (( $inc >= 2 )); do
    aussie=$(eval printf "$inc"); 
    inc=$((inc-2))
    tellar=$(eval printf "$inc"); 
    inc=$((inc 2))
    demon=$(printf "%s»%"$smoll"s%s" $demon ${aussie:1:-1} " " $tellar);
    inc=$((inc-3))
done
demon=$(echo $demon | sed -E "s/»/`space=${#demon}; while (( smoll > i   )); do ( printf " " ); done; unset space;`n/g")
 

Вот текущий ввод и вывод, хотя ввод «неправильный».

вывод

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

1. Ваш пример ввода или вывода? Как выглядит другой?

2. это пример притворного вывода

3. каковы входные данные?

4. я отредактировал вопрос, чтобы он был более «наглядным» и проще для вас, парень

5. Похоже, вы неправильно поняли мой вопрос. Вы пытаетесь отформатировать некоторые входные данные, чтобы получить некоторые выходные данные. Вы показали пример вывода, но мы понятия не имеем, что это за ввод. Например, каковы входные данные, которые должны привести к выходу: [ - hello | value is 3] ? (завернутый в скобки, чтобы заставить обратные палочки работать с ведущими пробелами)

Ответ №1:

Учитывая набор переменных, максимальную ширину можно легко вычислить с помощью:

 setwidth(){
    width=0
    for str in "$@"; do
        [ $width -lt ${#str} ] amp;amp; width=${#str}
    done
}
 

Мы сохраняем результат в глобальной переменной width для последующего использования в строке printf формата.


Пример использования:

 
var1="123"
var2=" 2345"
var3="123456 89"

testprint(){
    setwidth "$@"
    echo right-justified:
    printf "55 %${width}s |n" "$@"
    echo
    echo left-justified:
    printf "55 %-${width}s |n" "$@"
}

testprint "$var1" "$var2" "$var3"
 

дающий:

 right-justified:
-       123 |
-      2345 |
- 123456 89 |

left-justified:
- 123       |
-  2345     |
- 123456 89 |
 

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

1. о, это сработает, может быть, я неправильно рассчитал $smoll, поэтому нижний код для меня был неуместен, в любом случае я чувствую благодарность