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

2024-01-03

我想转换

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...

to

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'

gives

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 命令将很长(可能是无限)的输入字符串分割成行?


fold可以成为你的朋友:

$ 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
...

From man fold:

折叠 - 将每个输入行换行以适合指定的宽度

-w, --width=宽度

使用 WIDTH 列而不是 80

所以事实上fold file是相同的fold -w 80 file

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 unix 命令将字符串分割为具有特定宽度的行?当输入字符串是无限的时候? 的相关文章

随机推荐