我是awk和sed的新手,我正在寻找一种截断80行字符的方法,但是我使用printf在该行中打印了几个字符串。最后两个字符串是那些给我带来问题的字符串,因为它们在我的代码的每次迭代中都有不同的大小。这是我目前的代码:
printf "%5d %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "$subject"
此代码用于创建通过Bash脚本传递的电子邮件摘要。我所知道的是,对于我的其他字符串的空格和要求,我在$ from和$ subject字符串之间有60个字符的空间。
感谢任何帮助。
答案 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