Thay thế tất cả các lần xuất hiện của hai khoảng trắng sau khi kết thúc câu chỉ bằng một khoảng trắng


9

Tôi bị mắc kẹt trong việc bao gồm các biểu thức thông thường với một lệnh sed.

H: Tôi muốn thay thế tất cả các lần xuất hiện của hai khoảng trắng sau khi kết thúc câu chỉ bằng một khoảng trắng .

Đây là những gì tôi đã làm:

sed 's/^ $/^$/' file  

Và nó đã không thay thế hai khoảng trắng bằng một khoảng trắng sau khi câu kết thúc.

Đầu ra tôi nhận được:

This is the output.  Hello Hello

Đầu ra tôi muốn:

This is the output. Hello Hello

@Rahul Tôi muốn đầu ra chứa một lần khoảng trắng sau khi câu kết thúc. Không phải hai khoảng trắng như trong câu đầu tiên. Tôi muốn đầu ra câu thứ hai
Zeus

Câu trả lời của @Jasen là chính xác. BTW, lệnh bạn đã thử có nghĩa là: Thay thế một dòng chỉ bao gồm một khoảng trắng duy nhất bằng một dòng trống. Đây là lý do tại sao nó không làm những gì bạn muốn.
rexkogitans

1
Chèn vào đây: chiến tranh trên không gian đơn và đôi sau khi dừng hoàn toàn
gerrit

@gerrit Cuộc chiến đó đã mất khoảng 20 năm trước. ;)
h4ckNinja

Câu trả lời:


12
 sed 's/\.   */. /g' < file

thay thế dấu chấm theo sau bởi hai hoặc nhiều khoảng trắng bằng dấu chấm theo sau là một khoảng trắng.


Lệnh của bạn thực sự hoạt động cho toàn bộ đoạn văn. Đó chính xác là những gì tôi muốn. Cảm ơn!
Zeus

hoặc sed -r 's/\.\s+/. /g' filevới GNU sed ...
Sundeep

@spasic sử dụng sed -Echứ không phải sed -r. Nó hoạt động với GNU sed và * BSD sed (bao gồm Mac OS X) và một số thứ khác. Nó được lên kế hoạch để đưa vào làm tiêu chuẩn trong POSIX "ngay bây giờ".
cas

@cas Tôi nhớ lại đôi khi, tôi đã đề xuất sed -Evới ai đó trên trang này không hoạt động nhưng sed -rđã hoạt động .. Tôi đã làm việc với GNU sed một mình, vì vậy không có ý tưởng nào về POSIX và các biến thể khác .. sẽ cố gắng đưa chi tiết này vào tương lai , cảm ơn :)
Sundeep

Nó phải là một phiên bản cũ của GNU sed. -EBây giờ họ đã hỗ trợ khá lâu (ít nhất là từ năm 2011, nhưng trang thông tin và người đàn ông vẫn chỉ đề cập đến -r)
cas

13

sedLệnh của bạn 's/^ $/^$/'sẽ không làm những gì bạn muốn. Nó chỉ thay thế tất cả các dòng chứa một khoảng trắng bằng một dòng chứa ^$.

Phụ thuộc vào những ký tự đánh dấu cuối câu, bạn có thể làm:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Điều này sẽ thay thế 2 hoặc nhiều hơn các không gian sau ., ?hoặc !chỉ với một không gian.


1
có thể rút ngắn xuốngsed -r 's/([.?!])\s+/\1 /g' file
Sundeep

Cảm ơn. Nhưng bạn vui lòng giải thích tại sao rất nhiều dấu ngoặc tròn, vuông bạn đã sử dụng? Nó hơi khó hiểu.
Zeus

1
@spasic: Đó chỉ hoạt động với GNU sed, được cập nhật với phiên bản đơn giản hóa.
cuonglm

@Zeus: Đó là cú pháp chuẩn với BRE mặc định.
cuonglm

1
Không, sedtập lệnh chỉnh sửa ban đầu sẽ thay thế bất kỳ dòng nào chứa một khoảng trắng bằng chuỗi ký tự ^$.
Kusalananda

7

Đây là những gì bạn có thể đang tìm kiếm,

tr -s " " <filename

Mẫu vật,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Sử dụng sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
Vâng, nó đang hoạt động nhờ, nhưng tôi cần bao gồm lệnh sed. Vui lòng nói một cái gì đó tương tự như ở trên hiển thị, như thay thế, thay đổi văn bản, vv trong sed.
Zeus

2
Tôi đã không biết về tính năng tr này,
Jasen

3
Cách tiếp cận này cũng sẽ thay thế hai khoảng trắng không kết thúc câu.
cuonglm
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.