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

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

我可以在管道中插入什么命令以使第二个字节被静默丢弃?

我希望dst_prog仅接收字节0、2、4、6 ...

P.S。这需要适用于字节的所有值,而不仅仅是ASCII或UTF8。

sixupiaofubud 回答:如何删除管道中的每个第二个字节?

更新了另一个警告:

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

您可以使用fold将每个单个字节放入一行,使用awk除去奇数行,然后使用tr将其连接起来:

echo abcdefgh12345678 | fold -b -w 1 |  awk 'NR%2==1' | tr -d "\n"
aceg1357

P.S。 -b标志用于字节(不是字符),但似乎仅适用于单字节文本数据(ASCII)

,

您可以使用Ruby:

$ cat a.out | wc -c
9456
$ cat a.out | ruby -ne '$_.each_char.with_index{|c,i| print c if i.even?}' | wc -c
4728

相同但转储字节而不是计数:

$ cat a.out | hexdump -Cn10
00000000  7f 45 4c 46 02 01 01 00  00 00         |.ELF......|
$ cat a.out | ruby -ne '$_.each_char.with_index{|c,i| print c if i.even?}' | hexdump -Cn10
00000000  7f 4c 02 01 00 00 00 00  02 3e         |.L.......>|
本文链接:https://www.f2er.com/3110091.html

大家都在问