Làm việc trong một bản phân phối hệ điều hành Linux mang đến cho bạn một góc nhìn rất độc đáo về mức độ thay đổi của thế giới máy tính. Chẳng hạn, loại bỏ các ký tự khoảng trắng trên tệp văn bản nghe có vẻ như là một công việc tẻ nhạt trừ khi bạn đang sử dụng Linux làm hệ điều hành chính của mình Show
Khoảng trắng không chỉ nằm ngang như khoảng cách giữa các từ trong bài viết này hoặc các ký tự in được khác. Khoảng trắng cũng tồn tại dưới dạng khoảng cách dọc của các dòng và/hoặc đoạn văn. Vậy tại sao phải xóa khoảng trắng? Tệp văn bản tham khảoXét tệp văn bản mẫu sau $ sudo nano sample_file.txtTệp có khoảng trắng Theo ảnh chụp màn hình ở trên, rõ ràng chúng ta có thể lưu ý rằng tệp văn bản hiển thị các triệu chứng của cả ký tự khoảng trắng dọc và ngang. Chúng ta có thể sử dụng lệnh cat cộng với tùy chọn $ cat -n sample_file.txtXem tệp có số Các ký tự khoảng trắng rõ ràng được hiển thị trên tệp văn bản bao gồm khoảng trắng, tab và ngắt dòng. Để xóa tất cả các ký tự khoảng trắng này, chúng tôi sẽ xem xét sự trợ giúp và sử dụng ba lệnh Linux sẵn có Phương pháp 1. Sử dụng lệnh trLệnh tr sẽ lấy tệp văn bản ở trên làm đầu vào, dịch nội dung của tệp văn bản, xóa các ký tự khoảng trắng và sau đó ghi lại vào tệp đầu ra ký tự không phải khoảng trắng Tuy nhiên, chúng tôi cần cung cấp lệnh tr với các yêu cầu thực thi cụ thể i. e. xóa các ký tự khoảng trắng ngang, ký tự khoảng trắng dọc hay cả hai Xóa các ký tự khoảng trắng ngang trong tệpChúng tôi sẽ sử dụng tùy chọn ký tự $ tr -d "[:blank:]" < sample_file.txt | cat -nXóa các ký tự khoảng trắng ngang trong tệp Theo đầu ra ở trên, chúng tôi đã loại bỏ thành công các ký tự khoảng trắng ngang khỏi tệp văn bản trong Linux Xóa tất cả các ký tự khoảng trắng trong tệpTùy chọn $ tr -d "[:space:]" < raw_file.txt | cat -nXóa các ký tự khoảng trắng trong tệp Phương pháp 2. Sử dụng lệnh sedVì lệnh sed được triển khai phổ biến với các biểu thức chính quy nên chúng ta có thể sử dụng nó theo cách sau $ sed 's/[[:blank:]]//g' sample_file.txt | cat -n [Remove Horizontal Spaces] $ sed ':a; N; s/[[:space:]]//g; ta' sample_file.txt | cat -n [Remove All Spaces]Xóa ký tự khoảng trắng trong lệnh Sed Phương pháp 2. Sử dụng lệnh awkTiện ích xử lý văn bản mạnh mẽ này sử dụng tập lệnh giống như C và các hàm và biến tích hợp khác để thao tác xử lý văn bản một cách linh hoạt Chúng tôi sẽ sử dụng chức năng gsub của nó theo cách sau để xóa các ký tự khoảng trắng nằm ngang $ awk '{gsub(/[[:blank:]]/,""); print}' sample_file.txt | cat -nXóa ký tự khoảng trắng trong lệnh Awk Để xóa tất cả các ký tự khoảng trắng khỏi tệp văn bản, chúng tôi sẽ thực hiện sửa đổi sau đối với lệnh trên $ awk -v ORS="" '{gsub(/[[:space:]]/,""); print}' sample_file.txt | cat -n Với ba cách tiếp cận lệnh Linux đã thảo luận ở trên, việc loại bỏ các ký tự khoảng trắng không mong muốn trên các tệp văn bản của bạn trong Linux sẽ không thành vấn đề Đôi khi, chúng tôi có thể cần xóa các ký tự khoảng trắng để làm sạch nội dung của một số tệp. Chúng ta có thể thực hiện việc này theo một số cách khác nhau từ dòng lệnh Linux Trong hướng dẫn này, chúng tôi sẽ đề cập đến cách xóa tất cả các loại khoảng trắng, bao gồm cả Unicode. Chúng ta cũng sẽ xem xét cách quản lý ngắt dòng một cách riêng biệt 2. Giới thiệu vấn đề2. 1. Ký tự khoảng trắng là gì?Khoảng trắng thường là khoảng cách giữa các ký tự in được. Điều này có thể nằm trong một dòng (ngang) hoặc các dòng phân tách (dọc) Đôi khi, chúng tôi muốn xóa tất cả các ký tự khoảng trắng khỏi tệp. Tuy nhiên, chúng ta thường gặp phải yêu cầu chỉ xóa các ký tự khoảng trắng nằm ngang. Nói cách khác, chúng tôi có thể muốn xóa tất cả các khoảng trắng khỏi mỗi dòng của tệp nhưng vẫn giữ chúng dưới dạng các dòng riêng biệt Trong hướng dẫn này, chúng ta sẽ khám phá cả hai kịch bản Chúng ta cũng nên lưu ý rằng bộ ký tự Unicode xác định một số ký tự khoảng trắng bổ sung, ví dụ: ký tự tab dọc (U+000B) và ký tự “không gian hình” (U+2007) 2. 2. Ví dụ đầu vàoHãy bắt đầu với một ví dụ về khoảng trắng ngang và dọc
Ở đây, chúng tôi đã sử dụng lệnh có tùy chọn -n để in nội dung tệp có số dòng. Bằng cách này, chúng ta có thể thấy rõ các dòng trống trong đầu ra Như kết quả ở trên cho thấy, tệp raw_file của chúng tôi. txt chứa các ký tự khoảng trắng khác nhau, chẳng hạn như dấu cách, tab và ngắt dòng. Mục tiêu của chúng tôi là loại bỏ tất cả Trong hướng dẫn này, chúng ta sẽ xem xét một số lệnh
Đây là những thứ rất phổ biến và nên được tìm thấy trong hầu hết các bản phân phối Linux 3. Sử dụng lệnh trLệnh tr đọc một luồng byte từ đầu vào tiêu chuẩn (stdin), dịch hoặc xóa các ký tự, sau đó ghi kết quả vào đầu ra tiêu chuẩn (stdout) Chúng ta có thể sử dụng tùy chọn -d của lệnh tr – for – để xóa các ký tự khoảng trắng. Cú pháp là. tr -d SET1 Vì vậy, tùy thuộc vào yêu cầu, việc chuyển đúng ký tự SET1 cho tr trở thành chìa khóa để chỉ xóa các ký tự khoảng trắng ngang hoặc tất cả khoảng trắng 3. 1. Chỉ xóa khoảng trắng ngangTrước tiên, hãy xóa tất cả khoảng trắng ngang khỏi tệp đầu vào. tr định nghĩa “[. trống. ]” được đặt cho tất cả các khoảng trắng nằm ngang Ngoài ra, chúng ta nên nhớ rằng lệnh tr chỉ đọc dữ liệu từ stdin. Do đó, chúng ta cần chuyển hướng nội dung của raw_file. txt sang stdin ________số 8_______Trong ví dụ này, chúng tôi cũng đã chuyển kết quả của tr sang cat -n để xác minh các dòng trống Vì vậy, như đầu ra cho thấy, chúng tôi đã xóa tất cả khoảng trắng ngang nhưng vẫn giữ ngắt dòng 3. 2. Xóa tất cả các ký tự khoảng trắngTiếp theo, hãy xóa tất cả các ký tự khoảng trắng khỏi tệp Các "[. không gian. ]” có nghĩa là tất cả các khoảng trắng ngang và dọc
Ở đây, chúng ta không cần chuyển đầu ra thành cat để thấy rằng không có ngắt dòng 4. Sử dụng Lệnh sedsed là một tiện ích chỉnh sửa luồng không tương tác được sử dụng rộng rãi 4. 1. Chỉ xóa khoảng trắng ngangTrước tiên, hãy xóa tất cả các ký tự khoảng trắng nằm ngang. “[. trống. ]” cũng là một lớp ký tự tiêu chuẩn POSIX viết tắt của khoảng trắng ngang sed hoạt động với các biểu thức chính quy. Để sử dụng lớp ký tự này trong biểu thức chính quy, nó trở thành “[[. trống. ]]“
4. 2. Xóa tất cả các ký tự khoảng trắngTương tự, “[. không gian. ]” là lớp ký tự tiêu chuẩn POSIX cho khoảng trắng ngang và dọc Tuy nhiên, khác với lệnh tr, chúng ta không thể thay thế [[. trống. ]] với [[. không gian. ]] trong lệnh sed để xóa tất cả khoảng trắng Theo mặc định, lệnh sed đọc, xử lý và xuất từng dòng. Khi nó ghi vào đầu ra, nó sẽ tự động thêm một ký tự xuống dòng vào không gian mẫu hiện tại nếu không gian mẫu không kết thúc bằng một dòng mới Do đó, ngay cả khi chúng ta thay thế [. không gian. ] trống, ngắt dòng quay lại khi sed xuất dòng Nếu chúng tôi muốn sed xóa khoảng trắng dọc, chẳng hạn như ngắt dòng, chúng tôi cần yêu cầu sed tiếp tục đọc và xóa khoảng trắng cho đến khi kết thúc tệp và sau đó chỉ xuất một lần
4. 3. Hiểu lệnh sedLệnh sed ở trên khá nhỏ gọn. Tuy nhiên, nó có thể không đơn giản để hiểu. Hãy phá vỡ nó một cách nhanh chóng và xem nó hoạt động như thế nào
Trong lệnh sed, ‘. một …. ta‘ hoạt động giống như một vòng lặp. Khi chúng ta thêm một dòng mới vào không gian mẫu bằng N; . Do đó, sed sẽ tiếp tục nối thêm dòng tiếp theo và xóa các ký tự khoảng trắng cho đến dòng cuối cùng trong tệp Khi đến cuối tệp đầu vào, N; . Do đó, sed sẽ xuất kết quả hiện tại trong không gian mẫu và kết thúc xử lý Bằng cách này, sed đã xóa tất cả các ký tự khoảng trắng, bao gồm cả ngắt dòng, khỏi tệp đầu vào Nhiều triển khai sed hỗ trợ ghi kết quả trở lại tệp đầu vào. Ví dụ: GNU Sed được sử dụng rộng rãi cung cấp tùy chọn -i để thực hiện các thay đổi “tại chỗ” 5. Sử dụng Lệnh awkawk là một tiện ích xử lý văn bản mạnh mẽ khác. Nó đã xác định tập lệnh giống như C của riêng mình và nhiều biến và hàm tích hợp để thao tác xử lý một cách linh hoạt 5. 1. Chỉ xóa khoảng trắng ngangawk cũng hỗ trợ các biểu thức chính quy. Do đó, lệnh awk hỗ trợ đầy đủ các lớp ký tự tiêu chuẩn POSIX, chẳng hạn như [. trống. ] và [. không gian. ] Chúng ta chỉ có thể gọi hàm gsub để xóa tất cả khoảng trắng theo chiều ngang
Như đầu ra ở trên cho thấy, chúng tôi đã giải quyết vấn đề 5. 2. Xóa tất cả các ký tự khoảng trắngTương tự như sed, theo mặc định, awk cũng đọc, xử lý và xuất từng dòng một Khi awk in các bản ghi, nó sẽ phân tách chúng bằng biến tích hợp. Giá trị mặc định của biến ORS là ngắt một dòng Do đó, chúng ta có thể thực hiện hai sửa đổi đối với lệnh awk ở trên để yêu cầu nó xóa tất cả khoảng trắng, bao gồm cả ngắt dòng
Tiếp theo, hãy xem nó hoạt động
6. Khoảng trắng UnicodeCho đến nay, chúng ta đã học được một số cách để loại bỏ các ký tự khoảng trắng khỏi các tệp đầu vào. Các giải pháp này sẽ hoạt động đối với tất cả các tệp văn bản ASCII Trong công việc hàng ngày của chúng tôi, hầu hết các tệp văn bản chúng tôi cần làm việc là tệp văn bản ASCII. Tuy nhiên, khoảng trắng chứa các ký tự Unicode không phải ASCII Bây giờ, hãy thảo luận về việc xử lý các ký tự Unicode. Chúng tôi cho rằng ngôn ngữ mặc định của chúng tôi là en_US. utf-8 6. 1. Một ví dụ đầu vàoTrước hết, hãy xem một tệp đầu vào chứa các ký tự Unicode không phải ASCII
Trong tệp này, chúng tôi có sáu ký tự Unicode ở định dạng. [Tên]. Code_In_Hex (Nhân vật) Bây giờ, hãy thử xóa các khoảng trắng ngang bằng giải pháp tr của chúng tôi từ raw_unicode này. tập tin txt
Như đầu ra cho thấy, tất cả các khoảng trắng ASCII đã bị xóa, chẳng hạn như dấu cách. Tuy nhiên, các khoảng trắng Unicode không phải ASCII trong ngoặc đơn vẫn còn đó Điều này minh họa rằng khi các tệp chứa các ký tự Unicode, mọi thứ hoạt động hơi khác một chút. Có thể phổ biến khi làm việc với các tệp Unicode trong Linux rằng các lệnh hoặc tập lệnh đã thử nghiệm của chúng tôi đột nhiên không hoạt động nữa Do đó, trước khi chúng tôi tập trung vào việc xóa khoảng trắng Unicode, bạn nên kiểm tra xem tệp của chúng tôi có chứa các ký tự Unicode hay không 6. 2. một mẹo. Kiểm tra các ký tự Unicode trong tệp văn bảnTrước hết, chúng ta có thể sử dụng lệnh file để kiểm tra xem một tệp văn bản chứa ASCII hay Unicode
Đầu ra cho chúng ta biết tệp nào chứa các ký tự Unicode Vì vậy, trong thực tế, nếu tập lệnh của chúng tôi đột nhiên không hoạt động trên một tệp cụ thể, trước tiên chúng tôi có thể muốn kiểm tra xem tệp có chứa các ký tự Unicode không 6. 3. Xóa khoảng trắng UnicodeThật không may, không có lớp ký tự tiêu chuẩn để khớp với tất cả các khoảng trắng Unicode. Tuy nhiên, chỉ có khoảng 20 ký tự Unicode với thuộc tính white_space=yes trong tổng số Do đó, chúng ta có thể xây dựng “lớp ký tự” của riêng mình để chứa tất cả các ký tự này 0Như câu lệnh trên cho thấy, chúng ta đã lưu tất cả các khoảng trắng Unicode trong một biến hệ vỏ có tên là $SPACES Sau đó, nếu chúng tôi muốn xóa tất cả các khoảng trắng Unicode, chúng tôi có thể tạo một lớp ký tự Regex “[$SPACES]” để thực hiện thay thế Tiếp theo, hãy xóa tất cả các khoảng trắng ngang, kể cả các khoảng trắng không phải ASCII, khỏi raw_unicode. txt bằng lệnh sed 1Như chúng ta có thể thấy trong kết quả ở trên, lệnh sed đã loại bỏ tất cả các khoảng trắng ngang, bao gồm cả những khoảng trắng không phải ASCII trong ngoặc đơn. Ngoài ra, các ký tự Unicode '✔' và '✖' vẫn còn đó Cuối cùng, hãy xem một ví dụ khác để xóa tất cả các khoảng trắng khỏi tệp bằng lệnh awk 27. Phần kết luậnTrong bài viết này, chúng ta đã học cách xóa khoảng trắng khỏi tệp văn bản bằng dòng lệnh Linux Mặc dù yêu cầu trông khá đơn giản, nhưng nó có thể có một vài biến thể. Chúng tôi đã xem xét cách giải quyết việc xóa khoảng trắng theo chiều ngang và chiều dọc bằng một số công cụ phổ biến của Linux Chúng tôi cũng thấy rằng khi một tệp chứa các khoảng trắng Unicode không phải ASCII, chúng tôi cần xử lý tệp đó theo cách khác Ngoài ra, chúng ta đã học cách kiểm tra xem tệp văn bản có chứa các ký tự Unicode hay không bằng cách sử dụng lệnh tệp tác giả dưới cùng Nếu bạn có một vài năm kinh nghiệm trong hệ sinh thái Linux và bạn muốn chia sẻ trải nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi |