Подтвердить что ты не робот

Удаление управляющих символов из файла

Я хочу удалить все управляющие символы из моего файла с помощью команд linux bash.

Есть некоторые управляющие символы, такие как EOF (0x1A), особенно вызывающие проблему при загрузке моего файла в другое программное обеспечение. Я хочу удалить это.

Вот что я пробовал до сих пор:

это отобразит все управляющие символы:

cat -v -e -t file.txt | head -n 10

^A+^X$
^A1^X$
^D ^_$
^E-^D$
^E-^S$
^E1^V$
^F%^_$
^F-^D$
^F.^_$
^F/^_$
^F4EZ$
^G%$

Здесь будут перечислены все управляющие символы с помощью grep:

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]'
+
1

-
-
1
%
-
.
/

соответствует указанному выше выводу команды cat.

Теперь я выполнил следующую команду, чтобы показать все строки, не содержащие управляющие символы, но он все еще показывает тот же вывод, что и выше (строки с управляющими символами)

$ cat file.txt | head -n 10 | grep '[^[:cntrl:]]'
+
1

-
-
1
%
-
.
/

Вот результат в шестнадцатеричном формате:

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]' | od -t x2
0000000 2b01 0a18 3101 0a18 2004 0a1f 2d05 0a04
0000020 2d05 0a13 3105 0a16 2506 0a1f 2d06 0a04
0000040 2e06 0a1f 2f06 0a1f
0000050

как вы можете видеть, шестнадцатеричные значения, 0x01, 0x18 являются управляющими символами.

Я попытался использовать команду tr для удаления управляющих символов, но получил ошибку:

$ cat file.txt | tr -d "\r\n" "[:cntrl:]" >> test.txt
tr: extra operand `[:cntrl:]'
Only one string may be given when deleting without squeezing repeats.
Try `tr --help' for more information.

Если я удалю все управляющие символы, я также удалю также новую строку и возврат каретки, который используется в качестве символов новой строки в окнах. Как удалить все управляющие символы, содержащие только те, которые требуются как "\ r\n"?

Спасибо.

4b9b3361

Ответ 1

Вместо использования предопределенного набора [:cntrl:], который, как вы заметили, включает в себя \n и \r, просто введите (в восьмеричном) управляющие символы, из которых вы хотите избавиться:

$ tr -d '\000-\011\013\014\016-\037' < file.txt > newfile.txt

Ответ 2

Попробуйте grep, например:

grep -o "[[:print:][:space:]]*" in.txt > out.txt

который будет печатать только буквенно-цифровые символы, включая знаки пунктуации и пробельные символы, такие как вкладка, новая строка, вертикальная вкладка, фид формы, возврат каретки и пробел.

Чтобы быть менее ограничительным и удалить только управляющие символы ([:cntrl:]), удалите их:

tr -d "[:cntrl:]"

Если вы хотите сохранить \n (который является частью [:cntrl:]), замените его временно на что-то еще, например.

cat file.txt | tr '\r\n' '\275\276' | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"

Ответ 3

Основываясь на этом ответе на unix.stackexchange, это должно сделать трюк:

$ cat scriptfile.raw | col -b > scriptfile.clean

Ответ 4

Немного поздно вечеринке: cat -v <file> который, как мне кажется, легче всего запомнить! "