Làm cách nào để xóa các dòng trống / trống khỏi một tệp trong Unix (bao gồm cả khoảng trắng)?


60

Làm cách nào để xóa các dòng trống / trống (chỉ bao gồm khoảng trắng) trong một tệp trong Unix / Linux bằng dòng lệnh?

nội dung của file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

đầu ra mong muốn

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
Đây là một câu trả lời hoành
tráng

Câu trả lời:


86

Dòng sed này nên thực hiện các mẹo:

sed -i '/^$/d' file.txt

-inghĩa là nó sẽ chỉnh sửa tập tin tại chỗ.


13
Nó thực sự cần phải là "/ ^ * $ / d" để xóa các dòng chỉ chứa khoảng trắng.
Sean Reifschneider

2
@SeanReifschneider Yêu cầu đó không có trong câu hỏi khi câu trả lời này được viết?
kasperd

4
@SeanReifschneider sẽ "/ ^ \ s * $ / d" sẽ không tốt hơn vì nó sẽ bao gồm các tab? Trong khi nó không được đề cập trong bài viết gốc, nó có vẻ là một lựa chọn mạnh mẽ hơn đối với tôi.
mrswadge


Tôi nhận đượcbad flag in substitute command: 'e'
ishandutta2007

29

grep

Giải pháp đơn giản là sử dụng lệnh grep( GNU hoặc BSD ) như dưới đây.

  • Xóa các dòng trống (không bao gồm các dòng có khoảng trắng).

    grep . file.txt
    
  • Xóa các dòng hoàn toàn trống (bao gồm các dòng có khoảng trắng).

    grep "\S" file.txt
    

Lưu ý: Nếu bạn nhận được màu không mong muốn, điều đó có nghĩa greplà bí danh của bạn grep --color=auto(kiểm tra bằng type grep). Trong trường hợp đó, bạn có thể thêm --color=nonetham số hoặc chỉ chạy lệnh dưới dạng \grep(bỏ qua bí danh).


ripgrep

Tương tự với ripgrep(phù hợp với các tệp lớn hơn nhiều).

Xóa các dòng trống không bao gồm các dòng có khoảng trắng:

rg -N . file.txt

hoặc bao gồm các dòng có khoảng trắng:

rg -N "\S" file.txt

Xem thêm:


2
grep .dường như là giải pháp đơn giản nhất
Leo

Nhược điểm của grep .so với các giải pháp khác là nó sẽ làm nổi bật tất cả các văn bản màu đỏ. Các giải pháp khác có thể bảo tồn các màu gốc. So sánh unbuffer apt search foo | grep .vớiunbuffer apt search foo | grep -v ^$
wvducky

1
@wisbucky Bạn thấy màu sắc, vì grepđược đặt bí danh grep --color=autotrên hệ thống của bạn (kiểm tra bằng type grep:). Bạn có thể chạy nó như \grephoặc sử dụng --color=nonetham số.
kenorb

@kenorb Nếu bạn sử dụng grep --color=none ., bạn sẽ nhận được tất cả văn bản màu trắng, ghi đè định dạng màu của lệnh gốc (ví dụ apt search foo:)
wvducky

grep .sẽ khớp với các dòng chỉ chứa khoảng trắng mà OP cho là không mong muốn.
Jim L.

27
sed '/^$/d' file.txt

d là lệnh sed để xóa một dòng. ^$là một biểu thức chính quy chỉ khớp với một dòng trống, một dòng bắt đầu theo sau là một dòng kết thúc.


+1 cho lời giải thích
Alex Raj Kaliamoorthy

Lệnh này không tạo ra đầu ra giống như OP yêu cầu (nó tạo ra 5 dòng chứ không phải 4).
kenorb

22

Bạn có thể sử dụng tùy chọn -v với grep để xóa các dòng trống phù hợp.

Như thế này

grep -Ev "^$" file.txt

4
Tôi không tin rằng bạn cần -E, ít nhất là không phải với GNU grep, nhưng ngoài ra tôi rất vui khi thấy điều này được thực hiện với grep! Đó là những gì tôi đạt được để ưu tiên cho sed, mọi lúc; Bộ lọc nội tuyến dường như tốt hơn so với các trình soạn thảo nội tuyến.
MadHatter

Nếu bạn muốn bỏ qua các dòng bình luận và trống, đặc biệt là trong khi xử lý các tệp conf sử dụnggrep -Ev '^#|^$' file.txt
Govind Kailas

7

Đây là một awkgiải pháp:

awk NF file.txt

Với Awk, NFchỉ được đặt trên các dòng không trống. Khi điều kiện này khớp, hành động mặc định của Awk là in toàn bộ dòng.


6

Để xóa các dòng trống, bạn có thể ép lặp lại dòng mới bằng tr:

cat file.txt | tr -s '\n' '\n'

Điều này tạo ra 6 dòng, không phải 4 như OP yêu cầu.
kenorb

1

xargs nếu bạn không nhớ tước bỏ khoảng trắng hàng đầu

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

Vd / Vim

Đây là phương pháp sử dụng extrình soạn thảo (một phần của Vim):

ex -s +'v/\S/d' -cwq test.txt

Đối với nhiều tệp (chỉnh sửa tại chỗ):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Lưu ý: :bufdoLệnh không phải là POSIX .

Không sửa đổi tệp (chỉ in trên đầu ra tiêu chuẩn):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Đối với tôi, lệnh @ martigin-heemels đã ném lỗi này đã sửa nó (tức là một thông số giả cho tôi),

sed -i '' '/^$/d' file.txt


0

Có lẽ cách dễ nhất để xóa các dòng trống (không có dấu cách) là sử dụng cat -s:

$ cat -s file
$ some-command | cat -s

Ít nhất là nếu bạn không muốn chỉnh sửa một tập tin tại chỗ nhưng ví dụ, hãy ghi vào thiết bị đầu cuối. Ngoài ra, nó không liên quan đến bất kỳ hoạt động kinh doanh regex hài hước nào nên rất dễ nhớ ngay cả đối với những người không thân thiện với RE.


Từ man cat:

-s, --squeeze-blank never more than one single blank line

Có thể khác nhau trên các hệ điều hành khác nhau nhưng đã có mặt trên một số Linux và OpenBSD lần trước tôi đã kiểm tra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.