Làm cách nào để xóa các dòng trống khỏi tệp (bao gồm tab và dấu cách)?


Câu trả lời:


26

Chỉ grepdành cho những khoảng trống:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], bên trong phạm vi ký tự ( [...]), được gọi là lớp ký tự POSIX. Có một vài lượt thích [:alpha:], [:digit:]... [:blank:]khớp với không gian trắng ngang (trong ngôn ngữ POSIX, đó là không gian và tab, nhưng ở các địa phương khác có thể có nhiều hơn, giống như tất cả các ký tự khoảng cách ngang Unicode trong các địa điểm UTF8) trong khi [[:space:]]khớp với trắng ngang và dọc ký tự khoảng trắng (giống như các [:blank:]thứ cộng như tab dọc, nguồn cấp dữ liệu biểu mẫu ...).

grep '[:blank:]'

Sẽ trở lại các dòng có chứa bất kỳ ký tự, :, b, l, a, nhoặc k. Các lớp nhân vật chỉ được nhận ra bên trong [...]^bên trong [...]phủ định tập hợp. Vì vậy, [^[:blank:]]có nghĩa là bất kỳ nhân vật nhưng những người trống.


1
cũng nên có một $kết thúc cho dòng?
Michael Durrant

@MichaelDurrant Nó không được neo ở hai bên
jordanm

1
@MichaelDurrant. [^[:blank:]]$sẽ chỉ khớp với các dòng kết thúc ở dạng không trống. Chúng tôi muốn các dòng chứa không trống ở bất cứ đâu
Stéphane Chazelas

@StephaneChazelas Tôi đã thử grep [: blank:] SOURCEFILE ngay cả lệnh này vẫn hoạt động. Tôi hiểu [] là dành cho lớp nhân vật, bạn có thể vui lòng cho tôi một số ý tưởng về cách hoạt động của nó không? đoạn trích: blank: là mới đối với tôi.
Jamshed Ansari3000272

Có trường hợp nào grep -E '\S'sẽ không làm việc?
terdon

21

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

$ awk NF file

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, awkhành động mặc định printsẽ in toàn bộ dòng.


Gọn gàng, điều này cũng loại bỏ các dòng với khoảng trắng.
wvducky

7

Làm thế nào về:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

hoặc là

sed -e '/^[[:blank:]]*$/d' source_file > newfile

I E

Đối với mỗi dòng, thay thế:

  • nếu nó bắt đầu (" ^")
  • với khoảng trắng hoặc tab (" [[:blank:]]") bằng 0 hoặc nhiều lần (" *")
  • và sau đó là kết thúc của dòng (" $")

Thông tin thêm về :: blank :: và các ký tự đặc biệt khác tại http://www.zytrax.com/tech/web/regex.htm#special


4
[[:space:]]bao gồm các tab. Nếu nó không regex của bạn sẽ thất bại nếu một khoảng trắng theo một tab.
jordanm

Các wctype(3)isalpha(3)trang mô tả những gì các lớp nhân vật sẽ phù hợp.
jordanm

Bạn có thể muốn xóa câu hỏi đầu tiên không trả lời câu hỏi.
Stéphane Chazelas

@MichaelDurrant bạn có thể vui lòng viết một số điều về [[: blank:]] không?
Jamshed Ansari3000272

Đã thêm thông tin cho [[: blank ::]]. Stephane, tại sao không phải là công việc đầu tiên? Tôi nghĩ // ở cuối sẽ thay thế dòng mà không có gì.
Michael Durrant

4

Bạn có thể sử dụng sedlệnh để xóa các dòng trống:

sed '/^$/d' in > out

Lệnh này xóa tất cả các dòng trống từ tệp "trong"


Điều đó không xóa các dòng chỉ chứa không gian và tab, như được yêu cầu cụ thể.
dave_thndry_085

3

Có vẻ như tôi đã tìm thấy một thứ không nhanh như vậy, nhưng cuối cùng cũng buồn cười:

| xargs -L1


1
Đẹp ngắn, nhưng nó còn hơn thế nữa: loại bỏ các khoảng trắng và tab hàng đầu.
jringoot

Oh, nó được tìm thấy thậm chí còn có khả năng hơn? - Tốt đẹp! ;-P
poige

1
Và nó cắt ngắn các dòng (mặc định ở 1024 ký tự) Xem các trang: linux.die.net/man/1/xargs
jringoot

Tôi đang yêu sâu hơn với công cụ đơn giản đó !!! 11)
poige


0

Sử dụng lệnh sau:

grep '\S' FILE

trong đó loại bỏ tất cả các dòng bao gồm cả không gian hoặc các tab.

Mặt khác, loại bỏ không bao gồm các dòng có dấu cách / tab, sử dụng:

grep . FILE

Ví dụ:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Xem thêm:

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.