Thay thế nhiều dòng trống bằng một dòng trống trong vim / sed


42

Câu hỏi ít nhiều nói lên tất cả. Tôi biết rằng /^$/dsẽ xóa tất cả các dòng trống, nhưng tôi không thể thấy cách nói 'thay thế hai hoặc nhiều dòng trống bằng một dòng trống'

Có ý kiến ​​gì không?

Câu trả lời:


48

Nếu bạn không bắn vim hoặc sed cho một số mục đích sử dụng khác, mèo thực sự có một cách tích hợp dễ dàng để thu gọn nhiều dòng trống, chỉ cần sử dụng cat -s.

Nếu bạn đã ở trong vim và muốn ở lại đó, bạn có thể thực hiện việc này bằng tìm kiếm nội bộ và thay thế bằng cách phát hành: :%s!\n\n\n\+!^M^M!g(^ M là đại diện trực quan của một dòng mới, bạn có thể nhập nó bằng cách nhấn Ctrl+ vEnter) hoặc tự lưu gõ bằng cách tách ra để mèo : :%!cat -s.


wow, không biết -stùy chọn của mèo - chỉ là một ghi chú lịch sử, nó không có trong POSIX, nhưng dường như có sẵn trong mèo BSD và GNU.
maxschlepzig

2
Đánh dấu là "chiến thắng" cho :%!cat -s. Học một cái gì đó GNnew mỗi ngày!
Andrew Bolster

3
Tôi nghĩ bạn cũng có thể sử dụng \ r thay vì ^ M như thế này:%s!\n\n\n\+!\r\r!g
Niko Bellic

Tôi cần điều này ngày hôm nay. Cảm ơn, Caleb! :)
Ngày

19

Sử dụng \nđể chỉ ra một dòng mới trong mẫu tìm kiếm. Sử dụng Ctrl+ Mtrong văn bản thay thế hoặc phản hồi. Xem :help pattern:help sub-replace-special(liên kết từ :help :s).

%s/\(\n\n\)\n\+/\1/

Bạn có thể giải thích làm thế nào để tìm kiếm mô hình?
Sagar Jain

@sjmp Yêu cầu: thay thế hai hoặc nhiều dòng trống bằng một dòng trống duy nhất. Thực hiện: thay thế ba hoặc nhiều dòng mới liên tiếp chỉ bằng hai dòng mới. Xem hướng dẫn để biết giải thích về các cấu trúc được sử dụng trong lệnh.
Gilles 'SO- ngừng trở nên xấu xa'

Nhưng tại sao bạn cần sử dụng một nhóm khi nội dung của nó được cố định?
Sabuncu

@Sabuncu Bạn không cần sử dụng một nhóm. Nhưng tại sao không sử dụng một nhóm? Ở đây, tôi đã sử dụng một nhóm vì bạn không thể sao chép-dán một lệnh với dòng mới trong văn bản thay thế: bạn cần chèn một ký tự Ctrl + M bằng chữ, \nkhông hoạt động trong văn bản thay thế.
Gilles 'SO- ngừng trở nên xấu xa'

Bây giờ tôi hiểu, cảm ơn bạn đã dành thời gian để trả lời.
Sabuncu

6

Nếu trong Vim, chỉ cần làm điều này:

:%!cat -s

2
Bạn có thể muốn thêm một chút chi tiết xung quanh cách thức hoạt động của nó, ngay cả khi nó chỉ là một trích dẫn từ mantrang.
jasonwryan

Không hoạt động trên windows 7
user674669

0

Sử dụng Perl:

perl -00 -pe ''

-00 tùy chọn dòng lệnh bật chế độ slurp đoạn, nghĩa là Perl đọc đoạn văn bản theo đoạn chứ không phải từng dòng.


0

Với sed (GNU sed) 4.2.2:

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE

-2

Tôi biết đây là mã ngớ ngẩn, nhưng tôi muốn giải quyết vấn đề này trong chưa đầy 10 phút và nó đã hoạt động

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniqloại bỏ các đường bằng nhau liền kề. Đó không phải là điều OP muốn.
pacholik

@pacholik anh nói rõ ràng "Thay thế nhiều dòng trống bằng một dòng trống duy nhất" KHÔNG xóa các dòng bằng nhau liền kề !!!
Mahmoud Zalt 30/03/2017

3
Vâng, chính xác ...
pacholik
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.