多文件多目录去除^@

多文件多目录去除^@

我的多个子目录中有多个文件,我需要删除控制字符“^@”的所有实例。只是基本的grep似乎不起作用。这是我最近尝试过的。

 grep -rl '\^@' ./ | xargs sed -i 's/[\^@]//g' 

有什么建议么?

答案1

^@通常是 NUL 字符(字节值 0)的表示。

许多非 GNU 文本实用程序无法处理该问题,因为它不应该在文本中找到。

某些版本的 GNUgrep可以通过以下方式找到它:

grep -P '\0'

GNUsed可以使用 删除它sed 's/\x0//g',所以:

grep -rlZP '\0' . | xargs -r0 sed -i 's/\x0//g'

如果你grep找不到它们,请尝试 GNU awk

find . -type f -exec gawk -vORS='\0' '
  /\0/{print FILENAME; nextfile}' {} + |
  xargs -r0 sed -i 's/\x0//g'

答案2

^@NUL 字节(数值0)通常是如何表示的,例如

$ printf "null\000byte\n" > nullbyte
$ cat -A nullbyte 
null^@byte$

处理它的一个问题是你不能在命令行上逐字传递它。这是不可能的,因为相同的字节用于终止命令行参数。相反,你必须以某种方式逃避它(并且\^@不会起作用。)

我的系统上的 GNU grep 支持的正则表达式似乎没有提供处理它的方法。另一方面,GNU sed 似乎理解\x00,因此可以将其删除:

$ sed -e 's/\x00//g' nullbyte  |cat -A
nullbyte$

tr也应该有效,尽管它没有-i

$ tr -d '\000' < nullbyte  | cat -A
nullbyte$

相关内容