在一个命令中截断管道文本的中间并替换为省略号

Sch*_*ems 0 bash shell

我有一个很长的文本流,它开始发送到stdout. 在 bash 中,我可以通过运行来显示前几行:

$ seq 1 5010 | head 5
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

或结束

$ seq 1 5010 | tail 5
5006
5007
5008
5009
5010
Run Code Online (Sandbox Code Playgroud)

但是我需要显示前 5 个和最后 5 个以及中间的省略号......所以输出可能看起来像

1
2
3
4
5
...
5006
5007
5008
5009
5010
Run Code Online (Sandbox Code Playgroud)

我需要在单行股票 bash 中执行此操作。那可能吗?如何?

ric*_*ici 5

这是一个 bash (v4) 解决方案:

seq 1 5010 | { mapfile -tn 5 a; printf "%s\n" "${a[@]}" ...; tail -n 5; }
Run Code Online (Sandbox Code Playgroud)

在 v3 上,以下应该可以工作(尽管它的行要长得多):

seq 1 5010 | {
  for x in 1 2 3 4 5; do IFS= read -r; echo "$REPLY"; done;
  echo ...;
  tail -n 5;
}
Run Code Online (Sandbox Code Playgroud)