Bash

Bash - 在可變長度的線條後面畫一條垂直線

  • November 20, 2019

我有一個具有以下格式的文本文件,我想在這些行之後添加一條垂直線,然後增加數字:

c4-1 d e c
c d e c
e-2 f g2
e4 f g2
g8-4\( a-5 g f\) e4 c
g'8\( a g f\) e4 c
c-1 r c2
c4 r c2 

我通過以下方式實現了行和編號while-loop

#!/bin/bash

while read -r line; do
   if [ -z "$line" ]; then
       echo
       continue
   fi
   n=$((++n)) \
   && grep -vE "^$|^%" <<< "$line" \
   | sed 's/$/\ \|\ \%'$(("$n"))'/'
done < file

並獲得如下輸出:

c4-1 d e c | %1
c d e c | %2
e-2 f g2 | %3
e4 f g2 | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c | %6
c-1 r c2 | %7
c4 r c2 | %8

現在我希望添加垂直對齊並獲得如下輸出:

c4-1 d e c            | %1
c d e c               | %2
e-2 f g2              | %3
e4 f g2               | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c    | %6
c-1 r c2              | %7
c4 r c2               | %8

這意味著我需要以某種方式獲取最長行的行長(此處:21 個字元)和每行的行長並添加空格的差異,我該如何實現呢?

您可以列印沒有對齊的行,column -t並使用虛擬分隔符格式化輸出:

#!/bin/bash

while read -r line; do
 if [ -z "$line" ]; then
   echo
   continue
 fi
 printf '%s@| %%%s\n' "$line" "$((++n))"
done < file | column -e -s'@' -t | sed 's/ |/|/'

在這裡,我在指示列的末尾@之前添加了一個 as 虛擬字元。|最後的sed命令用於在 . 之前刪除一個額外的空格字元|。需要選項-e以在輸出中保留空行。

輸出:

c4-1 d e c            | %1
c d e c               | %2
e-2 f g2              | %3
e4 f g2               | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c    | %6
c-1 r c2              | %7
c4 r c2               | %8

引用自:https://unix.stackexchange.com/questions/553067