我有一个bash管道,例如$ src_prog | dst_prog
。
我可以在管道中插入什么命令以使第二个字节被静默丢弃?
我希望dst_prog仅接收字节0、2、4、6 ...
P.S。这需要适用于字节的所有值,而不仅仅是ASCII或UTF8。
我有一个bash管道,例如$ src_prog | dst_prog
。
我可以在管道中插入什么命令以使第二个字节被静默丢弃?
我希望dst_prog仅接收字节0、2、4、6 ...
P.S。这需要适用于字节的所有值,而不仅仅是ASCII或UTF8。
更新了另一个警告:
$ 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.......>|