2013-02-04 46 views
14

Tôi muốn xóa tất cả các ký tự điều khiển khỏi tệp của mình bằng các lệnh bash linux.Xóa ký tự điều khiển khỏi một tệp

Có một số ký tự điều khiển như EOF (0x1A) đặc biệt đang gây ra sự cố khi tôi tải tệp của mình trong phần mềm khác. Tôi muốn xóa cái này.

Dưới đây là những gì tôi đã cố gắng cho đến nay:

này sẽ liệt kê tất cả các ký tự điều khiển:

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%$ 

này sẽ liệt kê tất cả các ký tự điều khiển sử dụng grep:

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

- 
- 
1 
% 
- 
. 
/

trận đấu đầu ra ở trên của lệnh cat.

Bây giờ, tôi chạy lệnh sau để hiển thị tất cả các dòng không chứa ký tự điều khiển nhưng nó vẫn hiển thị đầu ra tương tự như trên (dòng với ký tự điều khiển)

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

- 
- 
1 
% 
- 
. 
/

đây là sản phẩm dưới dạng hex:

$ 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 

như bạn có thể thấy, giá trị hex, 0x01, 0x18 là các ký tự điều khiển.

tôi đã cố gắng sử dụng lệnh tr để xóa các ký tự điều khiển nhưng có một lỗi:

$ 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. 

Nếu tôi xóa tất cả các ký tự điều khiển, tôi sẽ kết thúc xóa xuống dòng và vận chuyển trở lại cũng được sử dụng như các ký tự dòng mới trên cửa sổ. Làm cách nào để xóa tất cả các ký tự điều khiển chỉ giữ các ký tự được yêu cầu như "\ r \ n"?

Cảm ơn.

+0

'grep' sẽ grep dòng đầu ra trừ khi bạn đang sử dụng tùy chọn' -o'. – devnull

Trả lời

18

Thay vì sử dụng được xác định trước [:cntrl:] bộ, mà như bạn quan sát bao gồm \n\r, chỉ cần danh sách (trong bát phân) các ký tự điều khiển bạn muốn thoát khỏi:

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

Hãy thử grep, như:

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

sẽ chỉ in các ký tự chữ và số bao gồm ký tự dấu chấm và ký tự khoảng trắng như tab, dòng mới, tab dọc, nguồn cấp dữ liệu, trả lại dấu cách và khoảng trắng.

Để có ít hạn chế, và loại bỏ chỉ control characters ([:cntrl:]), xóa chúng bằng cách:

tr -d "[:cntrl:]" 

Nếu bạn muốn giữ \n (đó là một phần của [:cntrl:]), sau đó thay thế nó tạm thời để cái gì khác, ví dụ

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

Dựa trên this answer trên Unix.stackexchange, điều này sẽ làm các trick:

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

Nhờ có Bruce Ediger https://unix.stackexchange.com/questions/15855/how-to-dump-a-man-page/15866#15866?newreg=4613fa4638aa4965ac10b183c10678df –

0

Một chút muộn để đảng: cat -v <file> mà tôi nghĩ là dễ nhớ của rất nhiều!

Các vấn đề liên quan