bash-команда для замены всех вхождений в файле на нулевые байты

Есть файл, допустим, example_file, допустим, двоичный.

Я хочу заменить все вхождения в него строк example_str, на соответствующую последовательность нулевых байтов (\0), то есть чтобы каждый символ во вхождении был заменён на нулевой байт. (специально указывать \0\0\0\0\0\0\0\0\0\0\0 - не вариант, потому что (1) это неудобно, (2) я хотел бы использовать эту команду не один раз для разных строк)

Какой bash-командой это можно было бы сделать? Хотелось бы как можно короче и проще.


Ответы (2 шт):

Автор решения: AvidCoder

1. Нашёл такое решение:

python -c "n='example_file';r=b'example_str';f=open(n,'r+b');d=f.read().replace(r,b'\0'*len(r));f.seek(0);f.write(d)"

Вот такой же код, но в более читаемом виде:

file_name = 'example_file'
to_replace = b'example_str'
f = open(file_name, 'r+b')
data = f.read().replace(to_replace, b'\0' * len(to_replace))
f.seek(0)
f.write(data)

Так как файл двоичный, используется символ b перед строкой example_str. Это может быть необязательно, если unicode-строка удовлетворяет требованиям.

2. Также на англоязычной версии сайта мне подсказали другое решение:

perl -0777spe'BEGIN { $r = "\0" x length($s) } s/\Q$s/$r/g' -i -- -s=example_str example_file

Или, если покороче:

perl -0777spe'BEGIN{$r="\0"x length($s)}s/\Q$s/$r/g' -i -- -s=example_str example_file

Если example_str содержит специальные символы, то необходимо задать её в коде, например, для строки \0\1\2:

perl -0777spe'BEGIN{$s="\0\1\2";$r="\0"x length($s)}s/\Q$s/$r/g' -i -- example_file

Для строк с особыми символами, но без нулевых символов (с кодом 0), можно использовать printf:

perl -0777spe'BEGIN{$r="\0"x length($s)}s/\Q$s/$r/g' -i -- -s=$(printf "\1\2\3\1\2\3") example_file
→ Ссылка
Автор решения: Ivan

Используйте sed:

$ echo a | sed 's/./b/g'
b

$ echo aaa | sed 's/./b/g'
bbb

Для изменения файла добавьте sed'у ключ -i.

Дополнение после коментария, возьмем такой файл:

$ cat f
asdasd
asdas
test
asdad
asfasf
testtest
sdas
asda
test

И попробуем изменить все 'test' на что-нибудь:

$ sed '/test/s//AAAAAA/g' f
asdasd
asdas
AAAAAA
asdad
asfasf
AAAAAAAAAAAA
sdas
asda
AAAAAA
→ Ссылка