我的多个子目录中有多个文件,我需要删除控制字符“^@”的所有实例。只是基本的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$