55

私はawkとsedを初めて使用し、80文字で行を切り詰める方法を探していますが、printfを使用してその行にいくつかの文字列を出力しています. 最後の 2 つの文字列は、コードの反復ごとにサイズが異なるため、問題を引き起こすものです。これが私の現在のコードです:

printf "%5d  %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "$subject"

このコードは、Bash スクリプトを介して渡される電子メール メッセージの概要を作成するために使用されています。私が知っていることは、他の文字列のスペースと要件により、$from と $subject 文字列の間に 60 文字の余地があるということです。

どんな助けでも大歓迎です。

4

5 に答える 5

26

Bash を使用するだけでこれを解決する別の方法 (構文: ${var:0:80})、例:

printf "%5d  %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "${subject::80}"

これにより、 に到達する前に文字列が切り捨てられますprintf。この方法では、印刷される列ごとに個別に異なる最大幅を指定することもできます。

于 2014-01-07T23:53:29.550 に答える
2

切り捨てられたディレクトリ名で bash プロンプトをカスタマイズしようとすると、同じ問題が発生しました。最終的に機能したのは次のとおりです。

PS1='\u@\h:`echo $(basename $PWD) | cut -c 1-15`\$ '
于 2016-02-14T16:29:55.173 に答える
1

C版はどうですか?

#include <stdio.h>
int maxline = 80;
int main(int argc, char* argv[])
{
    char line[2048];
    if ((argc>1) && (atoi(argv[1]) > 0)) {
        maxline = atoi(argv[1]);
    }
    while (fgets(line, sizeof(line), stdin)) {
        line[maxline] = '\0';
        printf("%s\n", line);
    }
}
于 2013-11-06T06:05:22.760 に答える