web-dev-qa-db-ja.com

複数の文字列、80文字で行を切り捨てる

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

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

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

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

41
TZPike05

80文字で行を切り詰める方法を探しています...

出力をcutにパイプすることができます:

printf ... | cut -c 1-80

各行が80文字を超えないようにする(または指定した幅に収まるように行を折り返す)場合は、foldを使用できます。

printf ... | fold -w 80
107
devnull

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

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

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

18
Aaron R.

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

PS1='\u@\h:`echo $(basename $PWD) | cut -c 1-15`\$ '
2
user5925630

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);
    }
}
1
ChuckCottrill

Substrを使用すると、fromとsubjectの最初のn文字のみを取得できます。再生できるのは最大60文字で、「from」の最初の25文字と「subject」の最初の35文字を取得できるためです。

#!/usr/bin/gawk -f
BEGIN { 
 # set ouput delimiter to comma
 OFS=","
 #  set input delimiter to bar
 FS="|"  }

{
f=$1
month=$2
day=$3
year=$4
from=$5
subject=$6
from=substr(from,1,25) 
subject=substr(subject,1,35)
printf ("%5d,%3s%.2s,%4s,%s,%s\n",f,month,day,year,from,subject)
}

このファイルで上記を実行する

12123 | Jan | 14 | 1970 | [email protected] |「誕生日おめでとう」14545 | Jan | 15 | 1970 | [email protected] |「頭が大丈夫」27676 | Feb | 14 | 1970 | jack @ overthehill .com |「今夜も続けますか?」 29898 | Feb | 14 | 1970 | [email protected] |「もちろん、チョコレートを持ってきたら。」 34234 | Feb | 15 | 1970 | [email protected] |「昨夜は素晴らしい時間を過ごしました。あなたもやりましたね。週末を待てないで、ジャックを愛してください」

返品

12123,Jan14,1970,[email protected],"Happy birthday"
14545,Jan15,1970,[email protected],"Hope your head is ok"
27676,Feb14,1970,[email protected],"Still on for tonight?"
29898,Feb14,1970,[email protected],"Sure, if you bring the chocolate."
34234,Feb15,1970,[email protected],"Had a great time last night, hope
1
Peter Kelly