Bash 如何在一定数量的空格分隔输入处换行文本

Bash 如何在一定数量的空格分隔输入处换行文本

我有一个长字符串,例如:“1 2 6 9 18 19 25 67 89 102 140 187”,我想在指定数量的输入或空格后使用(例如在第三个输入上折叠)而不是数字来折叠或包装它的字符,各不相同。

答案1

最简单的答案可能是:

echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12" | xargs -n 3

答案2

这是一个 perl 脚本,它将 stdin 折叠在单词上(即用空格分隔的字符串)。您可以在命令行上指定“字数”。

将其另存为,例如,fold-words.pl 并使其可执行chmod +x fold-words.pl

#! /usr/bin/perl 

use strict;

my $max = shift ;

while (<>) { 
    my $count = 0;
    foreach my $word (split) {
        print "$word " ;
        $count++ ;
        print "\n" if ($count % $max == 0)
    }
    print "\n" if ($count % $max != 0);
    $count=0;
}

输出示例:

$ echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12"  | ./fold-words.pl 3
1 2 6 
9 18 19 
25 67 89 
102 140 187 
99 12 

(split)请注意,通过更改以使用任意正则表达式,可以对“单词”进行更严格(甚至奇怪)的定义。例如,(split /\t/)将仅在单个选项卡上拆分,而不是默认的“一个或多个空白字符”。

答案3

这是一个简单的 awk 版本;%3如果您希望每行有不同数量的字段,请更改 3 :

awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'

示例运行:

$ str="one two three four five"
$ echo $str | awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'
one two three
four five

相关内容