多个字符串,截断行为80个字符

时间:2013-11-06 05:32:02

标签: string bash awk

我是awk和sed的新手,我正在寻找一种截断80行字符的方法,但是我使用printf在该行中打印了几个字符串。最后两个字符串是那些给我带来问题的字符串,因为它们在我的代码的每次迭代中都有不同的大小。这是我目前的代码:

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

此代码用于创建通过Bash脚本传递的电子邮件摘要。我所知道的是,对于我的其他字符串的空格和要求,我在$ from和$ subject字符串之间有60个字符的空间。

感谢任何帮助。

5 个答案:

答案 0 :(得分:104)

  

我正在寻找一种截断80个字符的行的方法......

您可以将输出传输到cut

printf ... | cut -c 1-80

如果您想确保每一行不超过80个字符(或换行符合指定的宽度),您可以使用fold

printf ... | fold -w 80

答案 1 :(得分:18)

使用Bash(语法:${var:0:80})解决此问题的另一种方法,例如:

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

这会在字符串到达​​printf之前截断它。此方法还允许您单独为每个打印列指定不同的最大宽度。

答案 2 :(得分:2)

我尝试使用截断的目录名自定义bash提示符时遇到了同样的问题。最终奏效的是:

combinePrevious

答案 3 :(得分: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);
    }
}

答案 4 :(得分:1)

你可以使用substr来获取from和subject的前n个字符,因为你知道你最多只能有60个字符可以玩,你可以从&#39;中获取前25个字符。 &#39;&#39;。

#!/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 | jack@overthehill.com |&#34;生日快乐&#34;   14545 | Jan | 15 | 1970 | jill@thewell.com |&#34;希望你的头脑好吗&#34;   27676 | Feb | 14 | 1970 | jack@overthehill.com |&#34;今晚还在继续吗?&#34;   29898 | 2月| 14 | 1970 | jill@thewell.com |&#34;当然,如果你带上巧克力。&#34;   34234 |二月| 15 | 1970 | jack@overthehill.com |&#34;昨晚玩得很开心,   希望你也这样做。不能等待周末,爱杰克&#34;

返回

12123,Jan14,1970,jack@overthehill.com,"Happy birthday"
14545,Jan15,1970,jill@thewell.com,"Hope your head is ok"
27676,Feb14,1970,jack@overthehill.com,"Still on for tonight?"
29898,Feb14,1970,jill@thewell.com,"Sure, if you bring the chocolate."
34234,Feb15,1970,jack@overthehill.com,"Had a great time last night, hope