私はawkとsedが初めてで、80文字で行を切り詰める方法を探していますが、printfを使用してその行のいくつかの文字列を印刷しています。最後の2つの文字列は、コードの反復ごとにサイズが異なるため、問題を引き起こす文字列です。現在のコードは次のとおりです。
printf "%5d %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "$subject"
このコードは、Bashスクリプトを介して渡される電子メールメッセージの概要を作成するために使用されています。私が知っていることは、他の文字列のスペースと要件により、$ from文字列と$ subject文字列の間に60文字のスペースがあることです。
どんな助けも大歓迎です。
80文字で行を切り詰める方法を探しています...
出力をcut
にパイプすることができます:
printf ... | cut -c 1-80
各行が80文字を超えないようにする(または指定した幅に収まるように行を折り返す)場合は、fold
を使用できます。
printf ... | fold -w 80
Bashを使用してこれを解決する別の方法(構文:${var:0:80}
)、例:
printf "%5d %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "${subject::80}"
これは、printf
に到達する前に文字列を切り捨てます。この方法では、印刷される各列に異なる最大幅を個別に指定することもできます。
切り捨てられたディレクトリ名でbashプロンプトをカスタマイズしようとすると、同じ問題が発生しました。最後に働いたのは:
PS1='\u@\h:`echo $(basename $PWD) | cut -c 1-15`\$ '
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);
}
}
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