Вероятно, это лучший способ сделать это, но я придумал это решение, которое преобразует число в десятичное, а затем обратно в шестнадцатеричное (и вручную добавляет0x
):
printf '0x%x\n' "$((16#00080000))"
Что можно записать как:
printf '0x%x\n' "$((16#$(expr substr "$SUPERBLOCK" 64 8)))"
Если подход с двумя -этапами подходит, вы можете сначала использовать grep
для извлечения всех строк с недопустимыми символами в файл, а затем использовать команду sed
для фактической замены.
Обратите внимание, что, поскольку вы намерены избавиться от специальных (, то есть «не -печатаемых» символов ), вы можете попробовать использовать класс символов POSIX [:print:]
вместо перечисления символов, если ваш grep
/ sed
понимает это.
Итак, вы могли бы сначала использовать
grep '[^[:print:]]' uploadfile.txt > invalid_lines.txt
, чтобы извлечь все строки с недопустимыми символами для целей архивирования, а затем выполнить
sed -e 's/[^[:print:]]/ /g' uploadfile.txt > outputfile.txt
или, если вы абсолютно уверены, выполните редактирование места -с помощью
sed -i -e 's/[^[:print:]]/ /g' uploadfile.txt
, чтобы удалить их из файла.
Из sed docs("выбор строк путем сопоставления текста" )вы можете точно так же выбирать строки:
# First, report lines
sed -n '/[^a-zA-Z0-9&,-]/p' uploadfile.txt > reportfile.txt
# Then, correct and output text
sed -e 's/[^a-zA-Z0-9&,-]/ /g' uploadfile.txt > outputfile.txt
где опция -n
не выведет ничего, кроме того, что напечатано командой 'p', то есть целые строки, выбранные вашим самым регулярным выражением.