Trong Linux, có một số cách để xóa khoảng trắng trong văn bản. Trong bài viết này, tôi sẽ nói về awk và sed để thao tác văn bản trong Linux
Hãy bắt đầu với Sed
Sed là một tiện ích dòng lệnh tuyệt vời trong Linux. Có rất nhiều thứ bạn có thể làm với sed nhưng với mục đích của bài viết này, chúng ta sẽ chỉ nói về sed regex để xóa khoảng trắng trong chuỗi hoặc văn bản. Checkout tiện ích trực tuyến để xóa khoảng trắng. Ngoài ra, hãy kiểm tra sed tìm và thay thế cheatsheet bằng các ví dụ
Xóa khoảng trắng trong Bash bằng Sed
Hãy tạo một biến trong bash chứa chuỗi sau
text=" this is a test text to show how sed works to remove space"
Giả sử chúng ta muốn xóa tất cả các khoảng trắng trong văn bản trên bằng cách sử dụng sed
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace
Để giải thích ngắn gọn, chúng tôi đang lặp lại $text và chuyển sang sed. Trong sed, chúng tôi đang thay thế không gian không có gì "s/ //g". G cuối cùng có nghĩa là loại bỏ nó trên toàn cầu trên toàn bộ văn bản
Hãy nói rằng chúng tôi muốn xóa không gian hàng đầu bằng cách sử dụng sed
echo "$text" | sed 's/^ //g' this is a test text to show how sed works to remove space
sed s/^ / chỉ có nghĩa là không gian hàng đầu thay thế
Để xóa dấu cách bằng sed, hãy làm như sau
echo "$text" | sed 's/ \$//g' this is a test text to show how sed works to remove space
sed s/ $/ có nghĩa là dấu cách
Cách thay thế nhiều không gian bằng một không gian bằng Sed trong Linux
Để xóa nhiều khoảng trắng, hãy sử dụng [ ]+ trong sed. [ ]+ có nghĩa là khớp nhiều hơn một khoảng trắng. Hãy làm ví dụ tương tự bằng cách chèn thêm khoảng cách trong từ
text1="This is a test text to show how to remove multi spaces using sed in Linux" echo "$text1" | sed 's/[ ]\+/ /g' This is a test text to show how to remove multi spaces using sed in Linux
Lưu ý rằng chúng ta cần thoát ký tự đặc biệt + bằng dấu gạch chéo ngược trong khi [ ]+ trong sed
Cách thay thế nhiều khoảng trắng bằng một khoảng trắng cho mỗi dòng trong một tệp bằng Sed
Hãy tạo một tệp giả và vài dòng trong tệp đó
echo "this a first line with multiple spaces" > /tmp/test.txt echo "this a second line with multiple spaces" >> /tmp/test.txt
Hãy kiểm tra tập tin của chúng tôi
cat /tmp/test.txt this a first line with multiple spaces this a second line with multiple spaces
Ok chúng tôi có tập tin của chúng tôi. Giả sử chúng ta muốn thay thế nhiều khoảng trắng bằng một khoảng trắng bằng cùng một lệnh sed
cat /tmp/test.txt | sed 's/[ ]\+/ /g' this a first line with multiple spaces this a second line with multiple spaces
nó đã làm việc
Hãy nói rằng chúng tôi chỉ muốn sử dụng sed trên dòng thứ 2. Đã sử dụng sed '2s/[ ]+/ /g' để làm điều đó như hình bên dưới
________số 8Cách xóa khoảng trắng trong văn bản bằng AWK
Hãy lặp lại văn bản của chúng tôi một lần nữa
echo $text this is a test text to show how sed works to remove space Use awk gsub as shown below. echo "$text" | awk '{ gsub[/ /,""]; print }' thisisatesttexttoshowhowsedworkstoremovespace
Cách thay thế nhiều không gian bằng một không gian bằng Awk trong Linux
Chúng tôi sẽ sử dụng $text1 với nhiều khoảng trắng cho ví dụ này
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace0
Lưu ý rằng chúng tôi không cần thoát + vì nó không phải là ký tự đặc biệt trong awk gsub
Cách sử dụng Awk để thay thế nhiều khoảng trắng bằng một khoảng trắng cho mỗi dòng trong một tệp
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace1
Gói [lại
Bài đăng này tôi đã cố gắng đề cập đến hai tiện ích cơ bản awk và sed và chỉ ra cách sử dụng chúng để xóa khoảng trắng
Đô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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace2
Ở đâ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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace3
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 "[. khoảng trống. ]” có nghĩa là tất cả các khoảng trắng ngang và dọc
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace4
Ở đâ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. ]]“
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace5
4. 2. Xóa tất cả các ký tự khoảng trắng
Tương tự, “[. khoảng trống. ]” 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 [[. khoảng trống. ]] 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ế [. khoảng trống. ] 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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace6
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/[[. khoảng trống. ]]//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à [. khoảng trống. ]
Chúng ta chỉ có thể gọi hàm gsub để xóa tất cả khoảng trắng theo chiều ngang
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace7
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 [. khoảng trống. ]
- Đặ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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace8
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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace9
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
echo "$text" | sed 's/^ //g' this is a test text to show how sed works to remove space0
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
echo "$text" | sed 's/^ //g' this is a test text to show how sed works to remove space1
Đầ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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace30
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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace31
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
echo "$text" | sed 's/ //g' thisisatesttexttoshowhowsedworkstoremovespace32
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