Sed xóa khoảng trắng giữa các từ

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

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ảo

Xét tệp văn bản mẫu sau

$ sudo nano sample_file.txt 
Sed xóa khoảng trắng giữa các từ
Tệ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 -n để mở tệp này ở chế độ xem được đánh số

$ cat -n sample_file.txt
Sed xóa khoảng trắng giữa các từ
Xem 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 tr

Lệ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ệp

Chúng tôi sẽ sử dụng tùy chọn ký tự "[:blank:]" như một phần của lệnh và sau đó thực hiện lệnh cat để in bố cục cuối cùng của tệp

$ tr -d "[:blank:]" < sample_file.txt | cat -n
Sed xóa khoảng trắng giữa các từ
Xó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ệp

Tùy chọn "[:space:]" được sử dụng để xóa cả ký tự khoảng trắng ngang và dọc khỏi tệp văn bản

$ tr -d "[:space:]" < raw_file.txt | cat -n
Sed xóa khoảng trắng giữa các từ
Xóa các ký tự khoảng trắng trong tệp

Phương pháp 2. Sử dụng lệnh sed

Vì 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]
Sed xóa khoảng trắng giữa các từ
Xóa ký tự khoảng trắng trong lệnh Sed

Phương pháp 2. Sử dụng lệnh awk

Tiệ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 -n 
Sed xóa khoảng trắng giữa các từ
Xó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ào

Hãy bắt đầu với một ví dụ về khoảng trắng ngang và dọc

$ cat -n raw_file.txt
     1	     We Have Leading Spaces.
     2	Now We Have Two Tabs:		And An Empty Line:
     3	
     4	And We Have A Couple Of Trailing Blank Lines:
     5		      
     6		 

Ở đâ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

  • tr
  • sed
  • awk

Đâ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 tr

Lệ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 ngang

Trướ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ắng

Tiế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

$ tr -d "[:space:]" < raw_file.txt
WeHaveLeadingSpaces.NowWeHaveTwoTabs:AndAnEmptyLine:AndWeHaveACoupleOfTrailingBlankLines:

Ở đâ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 sed

sed 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 ngang

Trướ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. ]]“

$ sed 's/[[:blank:]]//g' raw_file.txt | cat -n
     1	WeHaveLeadingSpaces.
     2	NowWeHaveTwoTabs:AndAnEmptyLine:
     3	
     4	AndWeHaveACoupleOfTrailingBlankLines:
     5	
     6	

4. 2. Xóa tất cả các ký tự khoảng trắng

Tươ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

$ sed ':a; N; s/[[:space:]]//g; ta' raw_file.txt
WeHaveLeadingSpaces.NowWeHaveTwoTabs:AndAnEmptyLine:AndWeHaveACoupleOfTrailingBlankLines:

4. 3. Hiểu lệnh sed

Lệ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

  • một; . Nó chỉ định nghĩa một cái gọi là "a"
  • N;
  • S/[[. không gian. ]]//g;
  • ta – nhánh này sed trở lại nhãn “a“

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 awk

awk 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 ngang

awk 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

$ awk '{gsub(/[[:blank:]]/,""); print}' raw_file.txt | cat -n          
     1	WeHaveLeadingSpaces.
     2	NowWeHaveTwoTabs:AndAnEmptyLine:
     3	
     4	AndWeHaveACoupleOfTrailingBlankLines:
     5	
     6	

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ắng

Tươ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

  • Thay thế lớp ký tự bằng [. không gian. ]
  • Đặt một ký tự trống làm giá trị của biến ORS

Tiếp theo, hãy xem nó hoạt động

$ awk -v ORS="" '{gsub(/[[:space:]]/,""); print}' raw_file.txt | cat -n
     1	WeHaveLeadingSpaces.NowWeHaveTwoTabs:AndAnEmptyLine:AndWeHaveACoupleOfTrailingBlankLines:

6. Khoảng trắng Unicode

Cho đế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ào

Trướ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

$ cat raw_unicode.txt
Some Non-whitespace Unicode Characters:
[Check Mark]: U+2714 (✔)
[Cross Mark]: U+2716 (✖)

Some Unicode Whitespace Characters:
[Figure Space]: U+2007 ( )
[Thin Space]: U+2009 ( )
[Paragraph Separator]: U+2029 (
)
[Ideographic Space]: U+3000 ( )

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

$ tr -d "[:blank:]" < raw_unicode.txt
SomeNon-whitespaceUnicodeCharacters:
[CheckMark]:U+2714(✔)
[CrossMark]:U+2716(✖)

SomeUnicodeWhitespaceCharacters:
[FigureSpace]:U+2007( )
[ThinSpace]:U+2009( )
[ParagraphSeparator]:U+2029(
)
[IdeographicSpace]:U+3000( )

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ản

Trướ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

$ file raw_file.txt 
raw_file.txt: ASCII text

$ file raw_unicode.txt 
raw_unicode.txt: Unicode text, UTF-8 text

Đầ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 Unicode

Thậ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

$ tr -d "[:blank:]" < raw_file.txt | cat -n
     1	WeHaveLeadingSpaces.
     2	NowWeHaveTwoTabs:AndAnEmptyLine:
     3	
     4	AndWeHaveACoupleOfTrailingBlankLines:
     5	
     6  
0

Như 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

$ tr -d "[:blank:]" < raw_file.txt | cat -n
     1	WeHaveLeadingSpaces.
     2	NowWeHaveTwoTabs:AndAnEmptyLine:
     3	
     4	AndWeHaveACoupleOfTrailingBlankLines:
     5	
     6  
1

Như 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

$ tr -d "[:blank:]" < raw_file.txt | cat -n
     1	WeHaveLeadingSpaces.
     2	NowWeHaveTwoTabs:AndAnEmptyLine:
     3	
     4	AndWeHaveACoupleOfTrailingBlankLines:
     5	
     6  
2

7. Phần kết luận

Trong 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