bash-команда для замены всех вхождений в файле на нулевые байты
Есть файл, допустим, example_file, допустим, двоичный.
Я хочу заменить все вхождения в него строк example_str, на соответствующую последовательность нулевых байтов (\0), то есть чтобы каждый символ во вхождении был заменён на нулевой байт. (специально указывать \0\0\0\0\0\0\0\0\0\0\0 - не вариант, потому что (1) это неудобно, (2) я хотел бы использовать эту команду не один раз для разных строк)
Какой bash-командой это можно было бы сделать? Хотелось бы как можно короче и проще.
Ответы (2 шт):
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
Используйте 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