Câu trả lời:
Hãy thử như sau:
grep -v -e '^$' foo.txt
Các -e
tùy chọn cho phép mô hình regex cho phù hợp.
Các trích dẫn duy nhất xung quanh ^$
làm cho nó hoạt động cho Cshell. Các shell khác sẽ hài lòng với dấu ngoặc đơn hoặc dấu ngoặc kép.
CẬP NHẬT: Điều này đối với tôi đối với một tệp có dòng trống hoặc "tất cả khoảng trắng" (chẳng hạn như dòng cửa sổ có kết thúc dòng kiểu "\ r \ n"), trong khi ở trên chỉ xóa các tệp có dòng trống và kết thúc dòng kiểu unix:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, mọi thứ sau -e
được hiểu là mô hình.
grep -v -e '^[[:space:]]*$' -e '^#' file
sẽ cung cấp cho bạn tất cả các dòng không trống, không bình luận trong tập lệnh hoặc tệp cấu hình (hoặc bất kỳ loại tệp nào sử dụng ký tự băm để nhận xét).
-e
Tùy chọn cho phép các mẫu regex cho khớp." Điều đó rất sai lệch . -e
là một định nghĩa (POSIX-) cho: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(từ hướng dẫn ). Grep đã mong đợi một biểu thức chính quy (cơ bản) theo mặc định. Đối với mẫu này, bạn có thể bỏ -e
hoàn toàn : grep -v '^[[:space:]]*$' foo.txt
.
Giữ cho nó đơn giản.
grep . filename.txt
Sử dụng:
$ dos2unix file
$ grep -v "^$" file
Hoặc chỉ đơn giản là awk:
awk 'NF' file
Nếu bạn không có dos2unix, thì bạn có thể sử dụng các công cụ như tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Chạy mã-
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
Để hiểu thêm về cách thức / lý do tại sao điều này hoạt động, tôi khuyên bạn nên đọc các biểu thức thông thường. http://www.THER-expressions.info/tutorial.html
Tôi thích sử dụng egrep
, mặc dù trong thử nghiệm của tôi với một tệp chính hãng với dòng trống, cách tiếp cận của bạn hoạt động tốt (mặc dù không có dấu ngoặc kép trong thử nghiệm của tôi). Điều này cũng làm việc:
egrep -v "^(\r?\n)?$" filename.txt
Nếu bạn có chuỗi nhiều dòng trống liên tiếp và chỉ muốn một dòng trống trên mỗi chuỗi, hãy thử
grep -v "unwantedThing" foo.txt | cat -s
cat -s
triệt tiêu các dòng đầu ra trống lặp đi lặp lại.
Đầu ra của bạn sẽ đi từ
match1
match2
đến
match1
match2
Ba dòng trống trong đầu ra ban đầu sẽ được nén hoặc "nén" thành một dòng trống.
Giống như các câu trả lời trước:
grep -v -e '^$' foo.txt
Ở đây, grep -e
có nghĩa là phiên bản mở rộng của grep . '^ $' có nghĩa là không có bất kỳ ký tự nào giữa ^ (Bắt đầu dòng) và $ (cuối dòng). '^' và '$' là các ký tự regex.
Vì vậy, lệnh grep -v
sẽ in tất cả các dòng không khớp với mẫu này (Không có ký tự nào giữa ^ và $).
Bằng cách này, các dòng trống rỗng được loại bỏ.
-e
không có nghĩa là "phiên bản mở rộng của grep", có thể bạn đang nhầm lẫn với -E
? Hướng dẫn rõ ràng nói rằng -e
chỉ cần nói rõ ràng rằng một mô hình sau. Vì mẫu không bắt đầu bằng dấu gạch ngang và dù sao bạn cũng chỉ xác định một mẫu, nên bạn cũng có thể loại bỏ nó vì theo mặc định, grep mong đợi một mẫu regex: grep -v '^$' foo.txt
(không cần chức năng regex mở rộng). Ngoài ra, điều đáng nói là điều này không loại bỏ các dòng trống trong tệp, chỉ có điều được dẫn qua đầu ra. Đối với trường hợp đó, sed -i
sẽ là công cụ phù hợp.
Sử dụng Perl:
perl -ne 'print if /\S/'
\S
có nghĩa là khớp các ký tự không trống.
egrep -v "^ \ s \ s +"
egrep đã làm regex và \ s là khoảng trắng.
+ Nhân đôi mẫu hiện tại.
^ Là bắt đầu
Sử dụng:
grep pattern filename.txt | uniq
uniq
sẽ giảm các dòng trống liền kề thành chỉ một dòng trống, nhưng không loại bỏ chúng hoàn toàn. Tuy nhiên, tôi thích cố gắng sử dụng uniq
như vậy. Sắp xếp trước sẽ loại bỏ hiệu quả tất cả các dòng trống - chỉ để lại một dòng, nhưng sắp xếp lại thứ tự dòng có thể không được chấp nhận.
Đây là một cách khác để loại bỏ các dòng trắng và dòng bắt đầu bằng #
dấu hiệu. Tôi nghĩ rằng điều này là khá hữu ích để đọc các tập tin cấu hình.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
Đúng là việc sử dụng grep -v -e '^ $' có thể hoạt động, tuy nhiên nó không xóa các dòng trống có 1 hoặc nhiều khoảng trắng trong đó . Tôi tìm thấy câu trả lời dễ nhất và đơn giản nhất để loại bỏ các dòng trống là việc sử dụng awk . Sau đây là một chút sửa đổi từ những người awk ở trên:
awk 'NF' foo.txt
Nhưng vì câu hỏi này là để sử dụng grep nên tôi sẽ trả lời như sau:
grep -v '^ *$' foo.txt
Lưu ý : khoảng trống giữa ^ và *.
Hoặc bạn có thể sử dụng \ s để thể hiện không gian trống như thế này:
grep -v '^\s*$' foo.txt