【问题标题】:How to find non-printable characters in the file?如何在文件中查找不可打印的字符?
【发布时间】:2014-11-01 10:46:50
【问题描述】:

我试图找出 unix 数据文件中不可打印的字符。 代码:

#!/bin/ksh
export SRCFILE='/data/temp1.dat'
while read line 
do
len=lenght($line)
for( $i = 0; $i < $len; $i++ ) {

        if( ord(substr($line, $i, 1)) > 127 )
        {
            print "$line\n";
            last;
        }
done < $SRCFILE

代码不工作,请帮我解决上述问题。

【问题讨论】:

标签: file grep find non-ascii-characters


【解决方案1】:

您可以使用grep 在文件中查找不可打印的字符,如下所示,可查找所有不可打印的 ASCII 和所有非 ASCII:

grep -P -n "[\x00-\x1F\x7F-\xFF]" input_file

-P 为您提供更强大的 Perl 正则表达式 (PCRE),-n 显示行号。

如果您的 grep 不支持 PCRE,我会直接使用 Perl:

perl -ne '$x++;if($_=~/[\x00-\x1F\x7F-\xFF]/){print"$x:$_"}' input_file

【讨论】:

  • 您好感谢您的信息,但 grep 命令不起作用。其实我想在文件中找到不可打印的字符,如果可以的话请帮忙
  • \x80-\xFF 范围涵盖非 ASCII,但 OP 要求不可打印字符,在 ASCII 上下文中,还包括 \x00-\x1F
  • 第一个 grep 缺少一个“x”。我不能编辑在这里只更改 1 个字符
  • @bjornruffians:谢谢,我已经添加了x
【解决方案2】:

你可以试试这样的:

grep '[^[:print:]]' filePath

【讨论】:

  • 您能否提供部分文件作为示例。你想再次显示包含这些字符的行或?
  • HI Smith,请查看以下记录
  • ABC|111112 |尝试过|印度 |澳大利亚 |英格兰 ABC|222222 |尝试过^Z |印度 |澳大利亚 |英格兰 ABC|333333 |尝试过|印度 |澳大利亚 |英国ABC|444444 |浪漫的^Z |印度 |澳大利亚 |英格兰
  • 在上面的记录中,我需要填充记录 #2 和 4,因为它们包含不可打印的字符,并且记录 1 和 3 看起来很好。
  • 如果您不想包含空格/制表符,则需要使用[^[:print:][:blank:]]
【解决方案3】:

这听起来很陈词滥调,但我现在不知道该怎么做。 我喜欢“od”,这取决于你在做什么,你可能想要适合打印任意字符的东西。 awk 代码不是很优雅,但如果您正在寻找细节,它是灵活的,重点只是展示 od 的用法。注意 awk 比较和空格等的问题,

cat filename | od -A n -t x1z | awk '{ p=0; i=1; if ( NF>16) { while (i<17) {if ( $i!="0d"){ if ( $i!="0a") {if ( $i" " < "20 " ) {print $i ; p=1;}  if ( $i" "> "7f "){print $i;   p=1;}}}  i=i+1} if (p==1) print $0; }}' | more

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多