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

Я хочу удалить все управляющие символы из моего файла с помощью команд 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"?

Благодарю.

4 ответа

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

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

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

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

Пытаться 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"

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

Другие вопросы по тегам