perl - 如何使用 unix 命令将字符串拆分为具有特定宽度的行?当输入字符串是无限的?

标签 perl unix sed

我要转换

Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He...

Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
llo.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hell
o.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
...,

宽度为 80 个字符。

我首先想到我可以使用sed。 (让我用 5 个字符而不是 80 个字符来解释清楚。)

echo "longlonglonglonglonglonglonglonglonglonglonglong" | sed 's/\(.\{5\}\)/\1\'$'\n/g'

给予

longl
onglo
nglon
glong
longl
onglo
nglon
glong
longl
ong

如我所愿。但是,当输入字符串永远持续时,我无法使用这种方式。

while true; do; echo -n "Hello."; done | sed 's/\(.\{5\}\)/\1\'$'\n/g'

上面的命令不起作用。我也尝试过使用 perl,但没有成功。 (perl -pe 's/(.{5})/$1\n/g') 所以我放弃了在 unix 命令中解决问题,而是用 C 编写了一个小程序。

#include <stdio.h>
int main(int argc, char *argv[]) {
  int i = 0, ch;
  while ((ch = fgetc(stdin)) != EOF) {
    putchar((char)ch);
    i += 1;
    if (ch == '\n') {
      i = 0;
    }
    if (i >= 80) {
      printf("\n");
      i = 0;
    }
  }
  return 0;
}

该程序对我来说效果很好。所以问题是,如何使用 unix 命令将 long long(可能无限)输入字符串拆分成行?

最佳答案

fold 可以成为你的 friend :

$ fold -w 80 file
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
llo.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hell
o.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
...

$ fold -w 20 file
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
...

来自 man fold:

fold - wrap each input line to fit in specified width

-w, --width=WIDTH

use WIDTH columns instead of 80

所以实际上 fold filefold -w 80 file 是一样的

关于perl - 如何使用 unix 命令将字符串拆分为具有特定宽度的行?当输入字符串是无限的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25604673/

相关文章:

用于修改 postgresql pg_hba.conf 的 sed 命令

perl - 打开目录并按创建日期对文件进行排序

linux - 如果 CPU 使用率持续高于一定数量,则发送警报电子邮件

perl - 如何打印行号 10 和 25 之间的行?

bash - rsync:--include-from 与 --exclude-from 的实际区别是什么?

bash - 将命令行参数与字符串进行比较

linux - 使用 Linux 脚本在文件中插入定界符

linux - 使用 sed 数据创建列(仅限 bash)

regex - 使用 perl 在 postgresql 查询中进行多重替换

perl - 在部署 Perl 项目之前如何确定 CPAN 依赖项?