将字符串格式化为在 shell posix 脚本中具有相同数量的字符
Format a string to have the same number of characters in a shell posix script
我有各种变量,我想做的是以相同的宽度(字符方式)打印它们。为此,我首先需要找出最长的字符串并向其添加一个,
然后用那个宽度打印较短的,用空格填充。
理想情况下,我希望输出像
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"
如果设备连接在左侧,则 4 个空格中的 2 个变为星号 (*),但此问题在右侧更容易解决 padding/formating
printf %15s $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")
这是当前的输入和输出,尽管输入是“错误的”。
给定一组变量,可以很容易地计算出最大宽度:
setwidth(){
width=0
for str in "$@"; do
[ $width -lt ${#str} ] && width=${#str}
done
}
我们将结果存储在全局变量 width
中,以供以后在 printf
格式字符串中使用。
使用示例:
var1="123"
var2=" 2345"
var3="123456 89"
testprint(){
setwidth "$@"
echo right-justified:
printf "5 %${width}s |\n" "$@"
echo
echo left-justified:
printf "5 %-${width}s |\n" "$@"
}
testprint "$var1" "$var2" "$var3"
给予:
right-justified:
- 123 |
- 2345 |
- 123456 89 |
left-justified:
- 123 |
- 2345 |
- 123456 89 |
我有各种变量,我想做的是以相同的宽度(字符方式)打印它们。为此,我首先需要找出最长的字符串并向其添加一个, 然后用那个宽度打印较短的,用空格填充。
理想情况下,我希望输出像
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"
如果设备连接在左侧,则 4 个空格中的 2 个变为星号 (*),但此问题在右侧更容易解决 padding/formating
printf %15s $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")
这是当前的输入和输出,尽管输入是“错误的”。
给定一组变量,可以很容易地计算出最大宽度:
setwidth(){
width=0
for str in "$@"; do
[ $width -lt ${#str} ] && width=${#str}
done
}
我们将结果存储在全局变量 width
中,以供以后在 printf
格式字符串中使用。
使用示例:
var1="123"
var2=" 2345"
var3="123456 89"
testprint(){
setwidth "$@"
echo right-justified:
printf "5 %${width}s |\n" "$@"
echo
echo left-justified:
printf "5 %-${width}s |\n" "$@"
}
testprint "$var1" "$var2" "$var3"
给予:
right-justified:
- 123 |
- 2345 |
- 123456 89 |
left-justified:
- 123 |
- 2345 |
- 123456 89 |