Удаление ^@ из нескольких файлов в нескольких каталогах

Мой /boot/loader/entries/arch.conf должен был быть

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options initrd=initramfs-linux.img root=PARTUUID={/dev/sda2 uuid} rw

(заменить {/dev/sda2 uuid} на фактический UUID)

1
09.10.2018, 18:40
2 ответа

^@ - это то, как часто представляется числовое значение0)байта NUL (, например.

$ 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$
0
28.04.2021, 23:41

^@обычно является представлением символа NUL (байтового значения 0 ).

Многие текстовые утилиты, не относящиеся к -GNU, не могут с этим справиться, поскольку они не предназначены для поиска в тексте.

Некоторые версии GNU grepмогли найти его с помощью:

grep -P '\0'

GNU sedможет удалить его с помощью sed 's/\x0//g', поэтому:

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

Если ваш grepне найдет их, попробуйте GNUawk:

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

Теги

Похожие вопросы