Bourne Shell Left Right Justify - PullRequest
       35

Bourne Shell Left Right Justify

2 голосов
/ 04 февраля 2010

Я пытаюсь выполнить некоторое форматирование выходных данных в скрипте и не уверен, как использовать выравнивание влево и вправо, а также ширину.Кто-нибудь может указать мне правильное направление?

Ответы [ 6 ]

4 голосов
/ 04 февраля 2010

вы можете использовать printf. Примеры

$ printf "%15s" "col1"
$ printf "%-15s%-15s" "col1" "col2"

инструменты, такие как awk, также имеют возможности форматирования

$ echo "col1 col2" | awk '{printf "%15s%15s\n", $1,$2}'
           col1           col2
1 голос
/ 04 февраля 2010

Вы не очень понятны, но, возможно, самый простой способ - просто использовать <a href="http://linux.die.net/man/1/printf" rel="nofollow noreferrer">printf()</a> (команда оболочки, а не функция C с тем же именем).

0 голосов
/ 04 февраля 2010

Здесь - это скрипт Perl, который выполняет полное выравнивание и перенос слов.

Вот разница для добавления функции левого поля в этот скрипт:

--- paradj.pl   2003-11-17 09:45:21.000000000 -0600
+++ paradj.pl.NEW       2010-02-04 09:14:09.000000000 -0600
@@ -9,16 +9,18 @@
 use TeX::Hyphen;

 my ($width, $hyphenate, $left, $centered, $right, $both);
-my ($indent, $newline);
+my ($indent, $margin, $newline);
 GetOptions("width=i" => \$width, "help" => \$hyphenate,
   "left" => \$left, "centered" => \$centered,
   "right" => \$right, "both" => \$both,
+  "margin:i" => \$margin,
   "indent:i" => \$indent, "newline" => \$newline);

 my $hyp = new TeX::Hyphen;

 syntax() if (!$width);
 $indent = 0 if (!$indent);
+$margin = 0 if (!$margin);

 local $/ = "";

@@ -147,6 +149,7 @@
       }
     }

+    print " " x $margin;
     print "$lineout\n";
   }
 }
@@ -185,6 +188,9 @@
   print "initial\n";
   print "                                indention (defaults ";
   print "to 0)\n";
+  print "--margin=n (or -m=n or -m n)  Add a left margin of n ";
+  print "spaces\n";
+  print "                                (defaults to 0)\n";
   print "--newline (or -n)             Output an empty line \n";
   print "                                between ";
   print "paragraphs\n";
0 голосов
/ 04 февраля 2010

Вы можете сделать это, используя чистый bash:

x="Some test text"
width="                    "      # 20 blanks
echo "${width:0:${#width}-${#x}}$x"

Вывод:

'      Some test text'             (obviously without the quotes)

Таким образом, вам нужно знать, что $ {# var} получит длинустроки в var, а $ {var: x: y} извлекает строку из позиций x в y.

Вам может потребоваться последняя версия (протестирована на GNU bash 3.2.25)

РЕДАКТИРОВАТЬ: Если подумать, вы можете сделать это так:

echo "${width:${#x}}$x"
0 голосов
/ 04 февраля 2010

Труба через fmt? На самом деле не специфично для Bourne Shell, но все же ...

0 голосов
/ 04 февраля 2010

Выравнивание по левому краю является тривиальным, для выравнивания по правому краю вы можете использовать printf и переменную окружения $COLUMNS, например:

 printf "%${COLUMNS}s" "your right aligned string here"
...