Xóa các dòng trống trong tệp văn bản qua grep


Câu trả lời:


129

grep . FILE


(Và nếu bạn thực sự muốn làm điều đó trong sed, thì sed -e /^$/d FILE:)

(Và nếu bạn thực sự muốn làm điều đó trong awk, thì awk /./ FILE:)


1
Ngọt! TY cũng cho các lệnh khác - nhưng có vẻ như grep là người bạn tốt nhất mới của tôi.
user191960

grep. FILE không hoạt động với tôi. Có lẽ tốt hơn nên gắn bó với grep để tìm kiếm nội dung tệp và sed để chỉnh sửa nội dung tệp.
Michael Dillon

7
sed -ne/./pcũng hoạt động và awk /./ngắn hơn (hành động là {print}nếu không xác định). @ ghostdog74: vậy grep '[^[:space:]]'.
ephemient

5
Đối với những người không hiểu, .biểu thức chính quy khớp với bất kỳ ký tự nào ngoại trừ dòng mới.
khôn ngoan

3
grep . FILEhoạt động với ví dụ đã cho, nhưng không nhất thiết khi tệp có thể có byte không phải là một phần của bộ ký tự. Ví dụ, với GNU grep 2.20, printf "\x80\n" | grep .không có kết quả nào.
vinc17

37

Hãy thử những cách sau:

grep -v -e '^$'

điều này có tác dụng tương tự như grep. TẬP TIN trong đó một khoảng trắng như một dòng trống sẽ được lấy ra.
ghostdog 74

1
"grep" tìm kiếm bất kỳ dòng nào phù hợp với mẫu. "." khớp với bất kỳ ký tự nào. "grep. FILE" khớp với bất kỳ dòng nào có ít nhất 1 ký tự. Trong khi "grep -v" loại trừ các dòng phù hợp với mẫu. OP nói "loại bỏ tất cả các dòng mới trống". Nếu bạn muốn loại trừ các dòng chỉ có dấu cách, "grep -v '^ $'". " " Sẽ khớp với 0 hoặc nhiều hơn của mẫu trước đó, trong trường hợp này là khoảng trắng. Mặc dù bạn có thể muốn đối sánh và loại trừ các ký tự khoảng trắng khác (tab, nguồn cấp dữ liệu biểu mẫu, v.v.).
Mr.Ree 23/10/09

3
Phương pháp này cho phép tôi kết hợp nhiều loại trừ dễ dàng hơn là chỉ "grep. FILE". Ví dụ: tôi đang xem một tệp conf và muốn loại trừ tất cả các dòng đã nhận xét và tất cả các dòng trống. Vì vậy, tôi đã sử dụng "grep -v -e '#' -e '^ $' ink.conf". Làm việc một điều trị.
Ben K

2
cái này nhanh hơn nhiều so với 'grep. TẬP TIN'. Điều này là do các nhiệm vụ xác minh regex 'phức tạp hơn.' hơn là loại trừ ngay khi ^ $ không khớp.
Édouard Lopez

2
grep -v -e '^$'luôn hoạt động, đó không phải là trường hợp của grep .. Ví dụ, với GNU grep 2.20, printf "\x80\n" | grep .không xuất ra dòng nào, trong khi printf "\x80\n" | grep -v '^$'xuất ra dòng không trống.
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

Không cần dấu ngoặc kép. Thủ thuật này được tìm thấy trong awk1line.txt- sau đó một lần nữa, vì vậy có nhiều thủ đoạn awk :)
ephemient

2
Tôi chỉ thực hành tốt để đặt dấu ngoặc kép, vì bạn đang chạy nó từ shell .. đối với các câu lệnh awk tổng hợp, bạn vẫn phải đặt dấu ngoặc kép. vậy tại sao không trau dồi thói quen này.
ghostdog 74

giải thích về cách thức hoạt động của điều này: stackoverflow.com/questions/23544804/…
Wisbucky

9

Đây là một giải pháp loại bỏ tất cả các dòng trống hoặc chỉ chứa các ký tự khoảng trắng:

grep -v '^[[:space:]]*$' foo.txt

2

Thử đi: sed -i '/^[ \t]*$/d' file-name

Nó sẽ xóa tất cả các dòng trống có bất kỳ không có. khoảng trắng (dấu cách hoặc tab) tức là (0 hoặc nhiều hơn) trong tệp.

Lưu ý: có 'dấu cách' theo sau là '\ t' bên trong dấu ngoặc vuông.

Công cụ sửa đổi -isẽ buộc ghi lại nội dung cập nhật trong tệp. Nếu không có cờ này, bạn có thể thấy các dòng trống đã bị xóa trên màn hình nhưng tệp thực tế sẽ không bị ảnh hưởng.


1

grep '^..' my_file

thí dụ

THIS

IS

THE

FILE

EOF_MYFILE

nó chỉ đưa ra các dòng có ít nhất 2 ký tự.

THIS
IS
THE
FILE
EOF_MYFILE

Xem thêm kết quả với grep '^' my_fileđầu ra

THIS

IS

THE

FILE

EOF_MYFILE

và cả với grep '^.' my_fileđầu ra

THIS
IS
THE
FILE
EOF_MYFILE

1

Nếu loại bỏ các dòng trống có nghĩa là các dòng bao gồm bất kỳ khoảng trắng nào, hãy sử dụng:

grep '\S' FILE

Ví dụ:

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

line2

line3

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

line3

line4

Xem thêm:


0

Hãy thử ex -way:

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

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

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

0

Perl có thể quá mức cần thiết, nhưng nó cũng hoạt động tốt.

Loại bỏ tất cả các dòng hoàn toàn trống:

perl -ne 'print if /./' file

Loại bỏ tất cả các dòng hoàn toàn trống hoặc chỉ chứa khoảng trắng:

perl -ne 'print if ! /^\s*$/' file

Biến thể chỉnh sửa bản gốc và tạo tệp .bak:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

Nếu bạn muốn biết tổng số dòng mã trong dự án Xcode của mình và bạn không quan tâm đến việc liệt kê số lượng cho mỗi tệp nhanh thì điều này sẽ cho bạn câu trả lời. Nó loại bỏ các dòng không có mã nào cả và loại bỏ các dòng có tiền tố là chú thích//

Chạy nó ở cấp cơ sở của dự án Xcode của bạn.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Nếu bạn có các khối nhận xét trong mã của mình bắt đầu bằng /*và kết thúc bằng */:

/*
 This is an comment block 
*/

thì những thứ này sẽ được tính vào số lượng. (Quá khó).


0

Câu trả lời đơn giản nhất -----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
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.