【问题标题】:Multiple strings, Truncate line at 80 characters多个字符串,在 80 个字符处截断行
【发布时间】:2013-11-17 06:15:18
【问题描述】:

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

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

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

感谢任何帮助。

【问题讨论】:

  • 为了帮助确保我不会误导任何人,我一直在这个 bash 脚本中使用 awk。我的解决方案实际上可能与 awk 或 sed 无关,因此我深表歉意。

标签: string bash awk


【解决方案1】:

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

您可以将输出通过管道传输到cut

printf ... | cut -c 1-80

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

printf ... | fold -w 80

【讨论】:

  • 哇...比我做的容易多了...非常感谢!
  • 或再次通过awk 运行输出:awk '{ print substr($0, 1, 80) }' 或附近。
  • 如果您想在 80 个字符内拆分整个单词,而不是硬性的 80 个字符限制,请使用 -s 选项和 fold。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您可以使用 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|jack@overthehill.com|“生日快乐” 14545|Jan|15|1970|jill@thewell.com|“希望你的头没事” 27676|Feb|14|1970|jack@overthehill.com|“今晚还有吗?” 29898|Feb|14|1970|jill@thewell.com|“当然,如果你带巧克力的话。” 34234|Feb|15|1970|jack@overthehill.com|“昨晚玩得很开心, 希望你也这样做了。等不及周末了,爱杰克”

      返回

      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
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-14
          • 2011-01-10
          • 2019-01-03
          • 1970-01-01
          • 2010-11-25
          • 1970-01-01
          • 2013-10-01
          • 2014-07-26
          相关资源
          最近更新 更多