Bash printf 列中 arg 中的多行

问题描述 投票:0回答:2

我已经摆弄这个好几个小时了,但无法让它工作,所以也许我的方法是错误的。

我想漂亮地显示多行消息,因此“标题”位于左侧,然后消息与列中的消息对齐,例如:

WARNING: The quick brown fox jumped over the lazy dog.
         Sphinx of black quartz, judge my vow.
         How quickly daft jumping zebras vex!

NOTE: This happened.
      Foo bar.

等等。

我正在尝试根据我能找到的一些答案使用

printf
column
来做到这一点,但正如我所说,也许这种方法永远行不通?

目前,我将

printf
的第一个字符串作为“标题”,然后其余的参数是与之对齐的消息,如下所示:

#!/bin/bash

warn() {
  printf '%s+%s\n' 'WARNING:' "${@}" | column --table --separator '+'
}

warn "The quick brown fox jumped over the lazy dog." \
     "+Sphinx of black quartz, judge my vow." \
     "+How quickly daft jumping zebras vex!"

可以类似地这样做吗?或者最好的方法/其他方法是什么?

实际产量:

WARNING:  The quick brown fox jumped over the lazy dog.    
          Sphinx of black quartz, judge my vow.            How quickly daft jumping zebras vex!
bash printf
2个回答
0
投票

这是一个简单的例子--

# cat foo.sh
function warn()
{
    local title='WARNING:'
    local len=${#title} head=$title
    local title2

    printf -v title2 '%*s' $len " "

    for msg; do
        printf '%s %s\n' "$head" "$msg"
        head=$title2
    done
}

warn 'The quick brown fox jumped over the lazy dog.' \
     'Sphinx of black quartz, judge my vow.' \
     'How quickly daft jumping zebras vex!'

运行它:

# bash foo.sh
WARNING: The quick brown fox jumped over the lazy dog.
         Sphinx of black quartz, judge my vow.
         How quickly daft jumping zebras vex!

0
投票

使用一点 Awk 和 Bash,您可以定义如下所示的函数。定义日志级别的参数,

WARNING
INFO
等,并将其作为参数传递

warn() {
  level="$1"
  echo "${@:2}" | 
      awk -v level="$level" -v RS="+" '
        BEGIN { align = length(level)+2 } 
        NR==1 { printf "%-*s%s\n", align, level":", $0; next } 
        { printf "%-*s%s\n", align, "", $0 }'
}

并将其称为

warn "WARNING" "The quick brown fox jumped over the lazy dog." \
     "+Sphinx of black quartz, judge my vow." \
     "+How quickly daft jumping zebras vex!"

产生

WARNING: The quick brown fox jumped over the lazy dog.
         Sphinx of black quartz, judge my vow.
         How quickly daft jumping zebras vex!

根据您定义的格式字符串运行良好,例如

WARNING
NOTE

© www.soinside.com 2019 - 2024. All rights reserved.