Linux unix-打印文件中控制字符的不同列表

Linux unix-打印文件中控制字符的不同列表,linux,perl,bash,shell,unix,Linux,Perl,Bash,Shell,Unix,例如,给定如下所示的输入文件: sid|storeNo|latitude|longitude 2|1|-28.03õ720000 9|2 10 jgn 352|1|-28.03¿720000 9|2|fd¿kjhn422-405 000¥0543210|gf¿djk39 gfd|f¥d||fd 输出(以下字符可以按任意顺序显示): 是否有人有一个函数(awk、bash、perl.etc)可以扫描每一行,然后输出(八进制、十六进制或ascii格式,两者都可以)一个不同的控制字符列表(为简单起见,

例如,给定如下所示的输入文件:

sid|storeNo|latitude|longitude
2|1|-28.03õ720000
9|2
10
jgn
352|1|-28.03¿720000
9|2|fd¿kjhn422-405
000¥0543210|gf¿djk39
gfd|f¥d||fd
输出(以下字符可以按任意顺序显示):

是否有人有一个函数(awk、bash、perl.etc)可以扫描每一行,然后输出(八进制、十六进制或ascii格式,两者都可以)一个不同的控制字符列表(为简单起见,控制字符是ascii字符126以上的字符)

使用PerlV5.8.8

sed -e 's/[A-Za-z0-9,|]//g' -e 's/-//g' -e 's/./&^M/g' | sort -u
删除所有你不想要的东西,把所有其他东西放在自己的行中,然后对整个工具包进行排序

在Bash中,&^M是“&”,后跟Ctrl-V和Ctrl-M


Unix获胜。

要以八进制打印字节:

perl -ne'printf "%03o\n", ord for /[^\x09\x0A\x20-\x7E]/g' file  | sort -u
要以十六进制打印字节,请执行以下操作:

perl -ne'printf "%02X\n", ord for /[^\x09\x0A\x20-\x7E]/g' file  | sort -u
要打印原始字节,请执行以下操作:

perl -nE'say for /[^\x09\x0A\x20-\x7E]/g' file  | sort -u

这将捕获序数值126上的所有内容,而无需显式剔除异常值

#!/bin/bash

while IFS= read -n1 c; do 
  if (( $(printf "%d" "'$c") > 126)); then
    echo "$c"
  fi
done < ./infile | sort -u

要删除除控制字符以外的所有内容,请执行以下操作:

tr -d '\0-\176' < input > output

有关详细信息,请参阅。

为什么不首先使用适当的字符集进行解码?@Ignacio-理想情况下,是的。但是从外部源接收数据,因此能够运行此检查将非常有用。Nit:只有一个“126以上的ascii字符”,因为ascii只有128个字符(编号为0-127)。当你说“ascii字符”时,你的意思是“字节”。这会输出“.”如果在输入中,“%02X\n”,ord是什么意思?@toop,
“%02X\n”
是的格式模式。返回作为其参数传递的字符串的第一个字符的字符号,默认值为
$\uu
。谢谢,要使其打印原始输入字符,需要做哪些更改?ie.?IFS=read-n1 c;做什么?“$c”中的单引号是什么?+1,我喜欢这个<代码>tr-d'\0-\177'<./infle | sed's//&\n/g'| sort-u以获取OP想要的内容。
¥
¿
õ
tr -d '\0-\176' < input > output
printf 'foobar\n\377' | tr -d '\0-\176' | od -t c