bash - 如何删除管道中的每个第二个字节?

标签 bash pipe byte

我有一个 bash 管道,例如$ src_prog | dst_prog.

我可以向管道中插入什么命令,以便每隔一个字节被静默丢弃?

我希望 dst_prog 只接收字节 0,2,4,6...

附言这需要适用于一个字节的所有值,而不仅仅是 ASCII 或 UTF8。

最佳答案

更新另一个awk:

$ echo -ne abcdef\\n123456\\nåäö | 
LC_ALL=C awk -F "" '{
    for(i=1;i<=NF;i++)                # iterate all chars
        if(i%2!=p)                    # output every other char
            printf $i
    if(p=((p&&NF%2)||(!p&&!(NF%2))))  # xor                                     
        printf "\n"                   # handle newlines, all but the last
}'

输出:

ace
246��

输出到 hexdump -C:

00000000  61 63 65 0a 32 34 36 c3  c3 c3 0a                 |ace.246....|
0000000b

它处理换行但在最后一个换行时失败(echo -n 但看到转储的结尾)。

或者你可以使用这个小的 c 程序:

$ cat foo.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int c;
  int i=0;

  while((c=getchar()) != EOF) {
    if((i=!i)!=0)
      printf("%c",c);
  }
  exit(0);
}

然后:

$ gcc -Wall foo.c && echo -n 1234äö | ./a.out | hexdump -C
00000000  31 33 c3 c3                                       |13..|
00000004

关于bash - 如何删除管道中的每个第二个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837213/

相关文章:

hash - 实现 MD5 : Inconsistent endianness?

c# - 如何在字节通过流时编辑字节?

c++ - 在 C++ 中从字节数组检索整数的最佳方法是什么

php - 自动替换服务器端 mysql 数据库转储中的用户密码 (Laravel)

bash - 读取文件权限并在 shell 中应用于另一个文件

c++ - Linux 中可以使用数据报管道吗?

c - 如何使用 fork 将多条记录从 parent 传递给 child

go - 如何强制golang关闭打开的管道

mysql - 当查询结果返回不匹配时需要显示替代文本

BASH:让多个 bash 后台进程写入同一个文件是否安全?