Sed xóa khoảng trắng ở đầu dòng

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ố 8

Cá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'
thisisatesttexttoshowhowsedworkstoremovespace
0

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'
thisisatesttexttoshowhowsedworkstoremovespace
1

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'
thisisatesttexttoshowhowsedworkstoremovespace
2

Ở đâ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'
thisisatesttexttoshowhowsedworkstoremovespace
3

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'
thisisatesttexttoshowhowsedworkstoremovespace
4

Ở đâ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'
thisisatesttexttoshowhowsedworkstoremovespace
5

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'
thisisatesttexttoshowhowsedworkstoremovespace
6

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'
thisisatesttexttoshowhowsedworkstoremovespace
7

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'
thisisatesttexttoshowhowsedworkstoremovespace
8

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'
thisisatesttexttoshowhowsedworkstoremovespace
9

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 space
0

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 space
1

Đầ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'
thisisatesttexttoshowhowsedworkstoremovespace
30

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'
thisisatesttexttoshowhowsedworkstoremovespace
31

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'
thisisatesttexttoshowhowsedworkstoremovespace
32

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

Chủ Đề